重命名批处理文件,但文件名中有空格时会发生错误。需要修复!巴什

时间:2014-10-08 02:46:46

标签: macos bash unix batch-file rename

所以我的代码有效。它正在做我想做的事。基本上我的脚本重命名文件以匹配它们所在的最后两个目录,然后是零填充。此外,它还需要一个参数,如果您键入目录,它将更改指定目录中的文件。

这是我的代码:

r="$@"
if [ -d "$r" ]; then            # if string exists and is a directory then do the following commands
  cd "$r"                       # change directory to the specified name
  echo "$r"                     # print directory name
elif [ -z "$1" ]; then          # if string argument is null then do following command
  echo "Current Directory"      # Print Current Directory
else                            # if string is not a directory or null then do nothing
  echo "No such Directory"      # print No such Directory
fi

e=`pwd | awk -F/ '{ print $(NF-1) "_" $NF }'`   # print current directory | print only the last two fields
echo $e
X=1;
for i in `ls -1`; do                            # loop. rename all files in directory to "$e" with 4 zeroes padding.
  mv $i $e.$(printf %04d.%s ${X%.*} ${i##*.})   # only .jpg files for now, but can be changed to all files.
  let X="$X+1"
done

这是输出:

Testdir_pics.0001.jpg
Testdir_pics.0002.jpg
...

但是,正如标题所示,当文件名中包含空格时会产生错误。我该如何解决这个问题?

1 个答案:

答案 0 :(得分:2)

如果文件名中有空格,则这两行将失败:

for i in `ls -1`; do 
  mv $i $e.$(printf %04d.%s ${X%.*} ${i##*.})

将其替换为:

for i in *; do 
  mv "$i" "$e.$(printf %04d.%s "${X%.*}" "${i##*.}")"

评论:

  • for i in *适用于所有文件名,即使是那些字符最难的文件名。相比之下,for i in $(ls -1)表达式非常脆弱。

  • 除非出于某些奇怪的原因,您确实希望对变量执行分词,否则请始终将它们放在双引号中。因此,mv $i ...应替换为mv "$1" ...