Jos*_*lin 6 command-line xargs
我想通过添加子目录的名称来重命名每个子目录中的文件。按照通过添加父文件夹名称来重命名文件的答案,我尝试了:
rename 's/(.*)\//$1\/$1_/' */*
Run Code Online (Sandbox Code Playgroud)
但是,对于许多子目录,它不起作用。我有 13,000 个子目录,每个子目录包含大约 300 个文件。我得到
-bash: /usr/bin/rename: Argument list too long
Run Code Online (Sandbox Code Playgroud)
我试过:
ls | xargs rename 's/(.*)\//$1\/$1_/' */*
find . -maxdepth 1 -type f -print0 | xargs rename 's/(.*)\//$1\/$1_/' */*
Run Code Online (Sandbox Code Playgroud)
两者都给出相同的错误:
-bash: /usr/bin/xargs: Argument list too long
Run Code Online (Sandbox Code Playgroud)
编辑
xargs -L rename 's/(.*)\//$1\/$1_/' */*
xargs -L1 rename 's/(.*)\//$1\/$1_/' */*
Run Code Online (Sandbox Code Playgroud)
同样的错误:
-bash: /usr/bin/xargs: Argument list too long
Run Code Online (Sandbox Code Playgroud)
正如@egmont 指出的那样,将路径 ( */*
) 作为参数xargs
是错误的。此命令从标准输入而不是参数中读取文件名,因此在xargs
没有任何标准输入(问题的 EDIT 部分)的情况下发出是无用的。
ls
和xargs
检查您是否可以只访问ls
所有有问题的路径。
ls */*
Run Code Online (Sandbox Code Playgroud)
如果是,您可以使用 2) 选项的更正版本:
ls */* | xargs rename -n 's/(.*)\//$1\/$1_/'
Run Code Online (Sandbox Code Playgroud)
find
如果您在ls
调用中遇到错误,您仍然可以使用find
.
-exec
与 类似的选项xargs
,所以xargs
在这种情况下我们根本不需要。ls */*
,请使用选项-mindepth 2 -maxdepth 2
。3) 选项的更正版本将是:
find . -mindepth 2 -maxdepth 2 -type f -exec rename -n 's/(.*)\//$1\/$1_/' {} \;
Run Code Online (Sandbox Code Playgroud)
参数占位符和转义分号 ( {} \;
) 确保rename
一次只运行一个文件,类似于xargs -L1
. 这将防止同时出现过多文件的原始问题。
您可以使用-n
我之后包含的选项来检查结果rename
,只需列出它会执行的重命名。要实际启动重命名操作,请删除-n
选项。