我想将我的照片存档到 tar 档案中。
包含照片的目录每年有一个目录,并且每年目录中有多个目录:
Photos
2005
2006
Some dir with spaces
Pic1.jpg
Pic2.jpg
...
Other dir here
...
2007
...
目标结构还应该包含每年一个目录,但在一年的目录内,我将为源目录中的每个子目录提供 tar.gz 文件,如下所示:
Backup
2005
2006
Some_dir_with_spaces.tar.gz
Other_dir_here.tar.gz
...
2007
...
我为此创建的脚本如下所示:
cd ~/Photos
for y in *
do
YEAR_DIR=~/Backup/$y
mkdir -p $YEAR_DIR
pushd $y
for d in *
do
f=`echo $d | tr ' ' '_' | tr -d ',.!'` # Clean the name
t=$YEAR_DIR/$f.tar.gz
d=$(printf '%q' "$d")
# echo tar czf $t "$d" # This outputs the command as expected
tar czf $t "$d" # but executing it results in error: Cannot stat: No such file or directory
done
popd
done
正如评论中所暗示的,回显准备好的命令看起来很好,而且如果我复制该语句并从终端执行它,它也可以工作,但在脚本 ( tar czf $t "$d"
) 中执行它会导致错误:
tar: Some\ dir\ with\ spaces: Cannot stat: No such file or directory
我究竟做错了什么?
PS 我是在 Mac 上做的。
答案1
您正在使用 printf 来转义空格,并引用它“”
如果省略 printf 调用,并使用带双引号的原始 $d ,就可以了。
f=`echo $d | tr ' ' '_' | tr -d ',.!'` # Clean the name
t=$YEAR_DIR/$f.tar.gz
##d=$(printf '%q' "$d") escapes the spaces
# echo tar czf $t "$d" # This outputs the command as expected
tar czf $t "$d" ## "$d" also escapes the spaces