我一直在使用这个 Bash 脚本:
for i in $(ls); do mv $i a$i; done
在文件夹中的所有文件名前面添加字母 a。我担心在某个时候我会不小心在错误的目录中使用此脚本,并添加大量我不想添加的文件名。所以我决定明确引用文件的路径。所以现在我的脚本如下所示:
for i in $(ls /cygdrive/c/Users/path/to/Images); do mv /cygdrive/c/Users/path/to/Images/$i /cygdrive/c/Users/path/to/Images/a$i; done
它确实在文件名前面添加了字母 a,但它也在文件名后面附加了这个 符号。
知道它为什么会这样吗?
如果有帮助的话,我在 Windows 7 机器上使用 cygwin。
谢谢您的帮助!
答案1
永远不要解析“ls”的输出。请改为执行以下操作:
for i in *; do mv "$i" "a${i}"; done
原因是文件名中可以包含像 \r 或 \n 这样的字符,而解析“ls”将无法找到它们。
更新:此链接处的有用信息: http://mywiki.wooledge.org/ParsingLs
根据 OP 提供的上述附加信息,使用以下命令:
对于 /cygdrive/c/Users/path/to/Images/* 中的 i;执行 mv“$i”“${i%/*}/a${i##*/}”;完成
这会产生一个相对糟糕的结果……每次运行它时,它都会重命名所有文件。这意味着文件“foo”将变为“afoo”。再次运行它时,它将变为“aafoo”,然后是“aaafoo”,等等。您可以通过避免任何以“a”开头的文件来解决这个问题,但这将避免所有以“a”开头的文件,即使它们尚未在脚本中重命名。
答案2
测试正确的目录,或移动到正确的目录(或两者):
从这里
E_WRONG_DIRECTORY=73
TargetDirectory=/cygdrive/c/Users/path/to/Images
cd $TargetDirectory
echo "Changing names in $TargetDirectory."
if [ "$PWD" != "$TargetDirectory" ]
then # Keep from wiping out wrong directory by accident.
echo "Wrong directory!"
echo "In $PWD, rather than $TargetDirectory!"
echo "Bailing out!"
exit $E_WRONG_DIRECTORY
fi
答案3
请声明ls /cygdrive/c/Users/path/to/Images
为变量。请使用变量作为 ,${i}
而不是。对于路径的$i
,也请使用。" "