我想用脚本重命名超过20k的文件,但它失败了:“参数列表太长了”

时间:2016-12-07 04:04:06

标签: linux bash shell sed rename

我通过这个

创建这些文件
for((i=0;i<20000;i++)
do
 touch "www.google.com electronic&information this is bash test ${date} .txt"
done

然后,我想将“www.google.com”替换为“HNSD”。 在20k文件中,所有文件名都包含空格。

我的第一次尝试如下:

rename 's/www.google.com/HNSD/g' *

...但是这产生了“参数列表太长”的错误。

我的第二次尝试如下:

 #!/bin/bash
function _rename ()
{ 
while read line1; do
#rename 's/www.google.com/HNSD/g' $line1
sed -i "s/www.google.com/HNSD/g" $line1
#echo $line1
done
}

ls -1 | _rename

...但这不会重命名给定的文件。该怎么做?

2 个答案:

答案 0 :(得分:1)

每个文件运行一个mv命令不会导致此问题,除非文件名本身太长(或者您的环境太满,因此挤出了与argv共享的空间)你不能同时在命令行上同时包含源名称和目标名称。因此,以下内容通常非常安全:

for f in *www.google.com*; do
  mv "$f" "${f//www.google.com/HNSD}"
done

在这里,我们使用parameter expansion来执行重命名操作。

原始代码存在问题,因为它试图立即在命令行上放置所有文件名。如果您使用xargsfind -exec {} +将操作拆分为多个调用,则不会出现此问题。如果你有rename,并希望尽可能少地调用它来处理当前位置的所有目录条目,那将如下所示:

printf '%s\0' * | xargs -0 rename 's/www.google.com/HNSD/'

答案 1 :(得分:1)

两个选项:

使用find,并在rename操作中使用-exec(或类似名称)重命名:

find . -type f -name '*www.google.com*' -exec rename 's/www.google.com/HNSD/g' {} +

利用for循环迭代文件:

for f in *www.google.com*; do rename 's/www.google.com/HNSD/g' "$f"; done