私の写真をtarアーカイブに保存したいです。
毎年写真を含む1つのカタログがあり、毎年複数のカタログがあります。
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