我正在尝试迭代目录中的所有文件,并使用下面的命令将它们从前缀 ABC 重命名为 XYZ
while read file; do mv \"$file\" \"$(echo $file | sed -e s/ABC/XYZ/g)\" ; done < <(ls -1)
当我在 mv
前面抛出一个 echo 时,一切看起来都应该正常工作,并且复制/粘贴输出的命令可以正常工作,但它不会在循环上下文中正确执行给我一个使用错误,就好像命令格式错误,如下所示。
usage: mv [-f | -i | -n] [-v] source target
mv [-f | -i | -n] [-v] source ... directory
即使通过 echo 检查输出的命令给出
mv "ABC Test1" "XYZ Test1"
这应该是一个有效的命令,并且如果我复制粘贴就可以工作。
知道发生了什么吗?
最佳答案
更换:
while read file; do mv \"$file\" \"$(echo $file | sed -e s/ABC/XYZ/g)\" ; done < <(ls -1)
与:
for file in *
do
mv "$file" "${file//ABC/XYZ}"
done
注释:
这非常重要:Never parse
ls
.ls
只是为了产生人性化的输出而设计的。要迭代目录中的所有文件,请使用
for file in *; do ...; done
。这对于所有文件名都可靠,包括带有换行符、空格或其他困难字符的文件名。\"
产生文字字符,而不是语法字符。因为我们想要"
的语法含义在这里,我们不对其进行转义。有时人们需要
sed
但这不是其中之一。 shell 能够进行简单的替换,而不会出现与命令替换相关的所有问题。因此,$(echo $file | sed -e s/ABC/XYZ/g)
可以替换为${file//ABC/XYZ}
.表格
${var//old/new}
称为模式替换,并记录在man bash
中.
关于bash - 这个文件重命名循环有什么问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49215853/