“-bash:/usr/bin/rename:参数列表太长”

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)

Mel*_*ius 5

正如@egmont 指出的那样,将路径 ( */*) 作为参数xargs是错误的。此命令从标准输入而不是参数中读取文件名,因此在xargs 没有任何标准输入(问题的 EDIT 部分)的情况下发出是无用的。

解决方案使用lsxargs

检查您是否可以只访问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.

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

  • 我认为他想要`-mindepth 2 -maxdepth 2`,这相当于`*/*`。 (2认同)