“-bash:/ usr / bin / rename:参数列表太长”
我想通过添加子目录的名称来重命名每个子目录中的文件。 通过添加父文件夹名称来重命名文件的答案,我试过:
rename 's/(.*)\//$1\/$1_/' */*
但是对于许多子目录,它不起作用。 我有13,000个子目录,每个目录包含大约300个文件。 我明白了
-bash: /usr/bin/rename: Argument list too long
我试过了:
ls | xargs rename 's/(.*)\//$1\/$1_/' */* find . -maxdepth 1 -type f -print0 | xargs rename 's/(.*)\//$1\/$1_/' */*
两者都给出了同样的错误:
-bash: /usr/bin/xargs: Argument list too long
编辑
xargs -L rename 's/(.*)\//$1\/$1_/' */* xargs -L1 rename 's/(.*)\//$1\/$1_/' */*
同样的错误:
-bash: /usr/bin/xargs: Argument list too long
正如@egmont所指出的那样 ,将路径( */*
)作为参数提供给xargs
是错误的。 此命令从标准输入而不是参数读取文件名,因此发出没有任何标准输入的xargs
(问题的EDIT部分)是无用的。
使用ls
和xargs
解决方案
检查您是否可以找到所有相关路径。
ls */*
如果是,您可以使用2)选项的更正版本:
ls */* | xargs rename -n 's/(.*)\//$1\/$1_/'
解决方案使用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_/' {} \;
参数占位符与转义分号( {} \;
)一起确保rename
仅针对单个文件运行,类似于xargs -L1
。 这样可以防止原始问题同时出现过多文件。
干运行和实际重命名
您可以使用rename
后包含的-n
选项检查结果,只列出它将执行的重命名。 要实际启动重命名操作,请删除-n
选项 。