“-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部分)是无用的。

使用lsxargs解决方案

检查您是否可以找到所有相关路径。

 ls */* 

如果是,您可以使用2)选项的更正版本:

 ls */* | xargs rename -n 's/(.*)\//$1\/$1_/' 

解决方案使用find

如果您从ls调用中收到错误,您仍然可以使用find

  1. 这个命令有一个-exec选项,它与xargs工作方式类似,所以在这种情况下我们根本不需要xargs
  2. 要模仿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选项 。