为什么这个脚本不起作用?

为什么这个脚本不起作用?

我一直在使用这个 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,也请使用。" "

相关内容