我通过这个
创建这些文件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
...但这不会重命名给定的文件。该怎么做?
答案 0 :(得分:1)
每个文件运行一个mv
命令不会导致此问题,除非文件名本身太长(或者您的环境太满,因此挤出了与argv
共享的空间)你不能同时在命令行上同时包含源名称和目标名称。因此,以下内容通常非常安全:
for f in *www.google.com*; do
mv "$f" "${f//www.google.com/HNSD}"
done
在这里,我们使用parameter expansion来执行重命名操作。
原始代码存在问题,因为它试图立即在命令行上放置所有文件名。如果您使用xargs
或find -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