所以我的代码有效。它正在做我想做的事。基本上我的脚本重命名文件以匹配它们所在的最后两个目录,然后是零填充。此外,它还需要一个参数,如果您键入目录,它将更改指定目录中的文件。
这是我的代码:
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
...
但是,正如标题所示,当文件名中包含空格时会产生错误。我该如何解决这个问题?
答案 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" ...
。