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选项。