私はディレクトリツリー全体を圧縮しようとしましたが、findで見つけたすべてのディレクトリの代わりに1つの.tar.bz2ファイルだけを残しました。目的は、毎週このタスクを実行するためのcronjobを作成することです。
zipにディレクトリを一覧表示するために正常に使用されたコマンドは次のとおりです。
find rootDirectory/ -mindepth 2 -type d -not -name '*.bz2'
タスク全体を圧縮して実行するために使用することは次のとおりです。
find rootDirectory/ -mindepth 2 -type d -not -name '*.bz2' -exec tar --remove-files -cjf ./{}.tar.bz2 ./{} \ ;
うまくいきますが、次のように圧縮された各ディレクトリに対してエラーが発生します。
find: ‘rootDirectory/directory2/02-09-2020-183833-700’: No such file or directory
rootDirectory/directory2/02-09-2020-183833-700.tar.bz2で目的の結果を得ましたが、実行中にエラーを削除したいと思います。私は何が間違っていましたか? 。
よろしくお願いします!
ベストアンサー1
私はアーカイブが作成された後に--remove-files
ソースディレクトリが削除されたと仮定します。tar
ユーティリティfind
はディレクトリが消えたことを知らず、検索条件に一致する他のコンテンツを見つけるためにディレクトリに入ろうとします。
この方法でアーカイブを生成するディレクトリを入力したくない場合は、コマンドの--prune
最後に次のように追加しますfind
。
find rootDirectory/ -mindepth 2 -type d ! -name '*.bz2' \
-exec tar --remove-files -cjf {}.tar.bz2 {} \; --prune
主な--prune
ガイドラインfind
は、調査対象のパスからその検索パスを削除して、そのディレクトリ(もはや存在しない)に入ろうとしないようにすることです。
この場合は でfind
生成するので、おそらくそうする必要はありません。これはループを使用して簡単に実行できます。tar
rootDirectory
for dir in rootDirectory/*/*/; do
tar --remove-files -cj -f "${dir%/}.tar.bz2" "$dir"
done
ここで唯一の違いは、隠された名前のディレクトリを見逃すことです。