无法重命名,没有这个文件或目录。

3
我有一个根目录(03_COMPLETE),其中包含40个子文件夹,它们都在两级下面(都叫CHILD_PNG),并且包含我想要重命名的.png文件。我必须遍历6个完整的文件夹,其中包含成千上万个文件。所有文件当前的命名方式如下:123456_lifestyle.png,我希望将它们命名为lifestyle_123456.png
我的代码:
find . -mindepth 2 -type f -iname '*.png' -print0 | xargs -0 /usr/local/bin/rename -v 's/\/([0-9]+)_([A-Za-z]+[0-9])/\/$2_$1/'\;

如果我在单个文件夹中运行 .png 文件(不使用-mindepth),它会对它们进行重命名。但是,如果我在根目录03_COMPLETE文件夹上运行以一次性完成所有重命名的工作,我就会遇到像这样的错误:
“无法将 '/Volumes/COMMON-LIC-PHOTO/RETOUCHING/04_DELIVERY_PNG/Computer1/03_COMPLETE/06052017_NYS5_W_1263_Output/CHILD_PNG/123456_lifestyle.png' 重命名为 '/Volumes/COMMON-LIC-PHOTO/RETOUCHING/04_DELIVERY_PNG/Computer1/03_COMPLETE/NYS5_06052017_W_1263_Output/CHILD_PNG/123456_lifestyle.png':没有该文件或目录”
我认为这可能与下面一级文件夹的名称有关(例如,在这里是NYS5_06052017_W_1263_Output),因为它确实在一些名为Bustform_000的文件夹中进行了重命名。但是大多数文件夹都以数字开头,例如06052017。
我无法弄明白为什么这在.png文件夹级别上可以正常工作,但在根文件夹上却不能,并且为什么它会在几个文件夹中重命名,而在大多数文件夹中却不行。
另外奇怪的是,在错误信息中,它说正在尝试将123456_lifestyle.png重命名为相同的文件名。为什么会这样?有什么想法吗?

我建议在\;之前插入一个空格。 - Cyrus
@Socowi:Perl 的独立重命名命令会在必要时创建目录。 - Cyrus
@Cyrus,刚注意到了并尝试了一下。不起作用 :( - James Trory
这个脚本可以在名为03_COMPLETE的文件夹内的/Bustform_000/CHILD_PNG和/OnFigure_000/CHILD_PNG中工作,但无法在类似于/07062017_NYS5_W_1293_OUTPUT/CHILD_PNG的任何文件夹中工作,因此我怀疑是这些文件夹名称中的某些内容阻止了脚本的运行。 - James Trory
正如我刚刚注意到的那样,\; 不是 xargs 命令的一部分,而是属于 find 命令的 -exec 选项。因此,在您的命令中它是不必要的。 - Cyrus
去掉了“;”,脚本行为没有改变。 - James Trory
3个回答

1
你可以进入每个CHILD_PNG目录并在其中运行单个rename,以便您不必为每个文件执行新的rename
find 03_COMPLETE -type d -name CHILD_PNG -execdir bash -c "cd {}; rename -n '...' *.png" \;

我尝试了这个,什么也没有发生。没有错误,什么都没有。 - James Trory
我没有放实际的rename代码 - 我留给你 - 我正在演示一种技术,因为你说你有在单个目录中工作的代码,我假设你会把它放在我留下省略号(...)的地方。 - Mark Setchell
是的,我在 '...' 的位置添加了重命名代码,但实际上什么也没有发生。 - James Trory
嗯...我可能对你的设置有所误解。尝试移除rename部分,然后将pwd; ls *png放在那里。 - Mark Setchell

1
这可能会有所帮助:

find 03_COMPLETE -type f | xargs -n 1 rename -n 's|/([^_/]*)_([^_/]*).png$|/$2_$1.png|'

如果输出正常,请删除-n


这确实有效,但是如果已经将任何PNG文件重命名为所需的标准(例如lifestyle_123456.png),则此脚本将再次将它们命名回123456_lifestyle.png。有没有办法阻止这种情况发生?我的原始正则表达式之所以好,是因为它非常具体,可以忽略任何不匹配的文件,以避免重命名任何已经正确的文件。 - James Trory

1
你原本的正则表达式存在问题,它匹配的是形如 "xxxxx_yyyyy" 的目录名称,并试图将它们转换为 "yyyyy_xxxxx",这显然是不存在的。由于你只想更改文件名,而且所有文件都以 .png 结尾,所以你可以使用下面的正则表达式。此外,由于你想匹配一个字面上的 '/',你可以选择不同的字符作为分隔符,比如 '|',以使正则表达式更易于阅读。
's|/([0-9]+)_([A-Za-z]+[0-9]*)(\.[Pp][Nn][Gg])|/$2_$1$3|'

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接