2017-05-28 71 views
1

我一直在研究此脚本以从我的目录中的所有文件夹中检索文件并尝试将其名称更改为我所需的输出。

文件名前: Folder\actors\character\hair\haircurly1.dds

文件名后: haircurly1.dds

我与超过12000个纹理与我从归档中提取不同名称的工作。我的提取器包括文件夹的路径,它在每个文件名中提取文件。例如,应该命名为haircurly1.dds的文件在提取过程中被命名为Folder\actors\character\hair\haircurly1.dds

cd ~/Desktop/MainFolder/Folder 

find . -name '*\\*.dds' | awk -F\\ '{ print; print $NF; }' 

此代码检索我期待在包含反斜线(正如我已经改变了一些与其他代码的文件的每一个纹理文件,但是我想要一个会改变所有文件一次,而不是我必须为每个文件夹编写12,000+纹理文件的特定代码)

我使用print;并把它发送我的文件路径:

./Folder\actors\character\hair\haircurly1.dds

我用打印$NF;和它的AWK分隔符后向我发送文本:

\ haircurly1.dds

我想每一个文件名这个脚本会一直运行到awk命令的$ NF输出。任何人都知道我可以如何让我的脚本将文件名更改为$NF输出?

谢谢

+0

你可以添加一个清晰的文件名前后的例子吗? – 123

+0

为清晰起见进行了编辑。 之前文件名:文件夹\演员\字符\头发\ haircurly1.dds 后文件名:haircurly1.dds –

+0

他们都在文件夹下面直接?尝试'为我in * \\ *;做回声“$我”“$ {i ## * \\}”;完成'?如果文件名看起来没问题,请将'echo'更改为'mv'。 – 123

回答

-2

让你的awk命令格式和打印“MV”命令,管结果打坏。额外的单引号确保bash将反斜杠视为普通字符。

find . -name '*\\*.dds' | awk -F\\ '{print "mv '\''" $0 "'\'' " $NF}' | bash -x 

心连心

+0

这用于更改文件名称,但它将所有内容都移动到当前目录之外的原始文件夹中。 –

+0

@DevinWalker这正是你的问题所暗示的 - 它说你想将名字从'X/Y/Z/haircut.dds'改成'haircut.dds',根据定义,它指的是当前目录,因为没有指定其他目录。 –

+0

@MarkSetchell他们在问题中是反斜杠。 – 123

0

你的问题还不清楚,但它听起来像所有你想做的事就是:

for file in *\\*; do 
    mv -- "$file" "${file##*\\}" 
done 

如果这不是你想要的,然后编辑你的问题,以澄清您的要求。