【发布时间】:2017-04-21 21:49:34
【问题描述】:
我通过这个创建这些文件
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
...但这不会重命名给定的文件。这应该怎么做?
【问题讨论】:
-
不要在脚本中使用
ls -1。不要使用read前面没有IFS=和后面的-r参数。不要使用未引用的参数。并且不清楚你是如何得到这个错误的,除非你有一个更长的参数列表,而不是作为 single 行传递给命令(例如sed)的一行,因为“参数列表太长”错误基于每个单独的外部命令的 argv。 -
而
sed -i根本不重命名文件;相反,它改变了它们的内容——所以不清楚你希望这个脚本如何实现你的既定目标。 -
另外,不要使用
function关键字——它会使您的代码与 POSIX sh 不兼容,而不会增加兼容语法的任何好处。 -
参见ParsingLS(关于为什么永远不应以编程方式使用
ls)、BashFAQ #30(关于重命名)和BashFAQ #1(关于正确使用while read)。 -
哦,对不起。我在目录中尝试 $rename 's/www.google.com/HNSD/g' *。它提示参数列表太长。然后,我想创建一个脚本并制作一个圆圈来重命名这些文件名。
标签: linux bash shell sed rename