特定のパスから30日以上経過したすべてのファイルとディレクトリを削除する方法を見つけたいと思います。ただし、そのパスには削除または変更したくない特定のディレクトリがあります。私は-pruneを読みましたが、うまく動作しないようです。これまでに試したコマンドは次のとおりです。find "<path to directory" -prune -o -name "<name of excluded directory" -type f -mtime +30 -exec rm {} +
答え1
コマンドロジックがfind
混乱しているようです。名前付きディレクトリを除いてファイル名を印刷するには、excludeme
次のように作成できます。
find /path/to/top/directory -name excludeme -prune -o -type f -print
これは-o
論理であるため、OR
有効な条件はコマンド-prune
と-o
同じ側になければなりません-prune
。
これを念頭に置いて、私たちは次のように結論を下します。
find "<path to directory" \
-name "<name of excluded directory> -prune -o \
-type f -mtime +30 -exec rm {} +
答え2
ワンステップ方法
ファイルだけでなくすべてのファイルとディレクトリを削除するには、そのディレクトリツリー内のファイルとディレクトリだけでなく、ディレクトリ自体も保護する必要があります。 (ファイルを削除した場合は問題が簡単になります。)これは次のように実行できます。
次のファイル構造(別のテスト例で借用)を考えてみましょう。
$ find
.
./tarfile
./work
./work/file1
./work/dir 4
./work/dir 4/file 1
./work/file2
./work/dir5
./work/dir5/sub1
./work/dir5/sub2
./work/ttt
./work/dir1
./work/dir1/file1
./work/dir1/file2
./work/dir1/file 3
./work/dir2
./work/dir2/file1
./work/dir2/file2
./work/dir3
./work/dir3/file1
./work/dir3/file2
./work/dir3/file3
./work/rsync-by-folder
./backup
./backup/dir 4
./backup/dir 4/file 1
./backup/dir1
./backup/dir1/file1
./backup/dir1/file2
./backup/dir1/file 3
./backup/dir2
./backup/dir2/file1
./backup/dir2/file2
./backup/dir3
./backup/dir3/file1
./backup/dir3/file2
./backup/dir3/file3
次のコマンドラインは、ディレクトリ./work/dir2
(およびそのパス)を除き、他のすべてのエントリ(ファイルとディレクトリ)を削除します。
$ find . -mindepth 1 -maxdepth 2 -mtime +45 -not \( -path ./work -or -path './work/dir2' \) -exec echo rm -r {} +
または(rm
インスタンスごとに1行)
$ find . -mindepth 1 -maxdepth 2 -mtime +45 -not \( -path ./work -or -path './work/dir2' \) -exec echo rm -r {} \;
rm -r ./work/file1
rm -r ./work/dir 4
rm -r ./work/file2
rm -r ./work/dir5
rm -r ./work/ttt
rm -r ./work/dir1
rm -r ./work/dir3
rm -r ./work/rsync-by-folder
rm -r ./backup
rm -r ./backup/dir 4
rm -r ./backup/dir1
rm -r ./backup/dir2
2段階の方法
潜在的に安全な回避策は、2つのステップで行うことです(findコマンドラインを設定するときにエラーが発生するリスクが少ない)。最初のステップは、元の質問と最初の答えにすでに表示されているものと一致し、保護する必要があるディレクトリツリーの外側のファイルを削除します。私の場合は一致します。
$ find . -mtime +45 -not -path '*/dir2/*' -type f -exec rm -r {} +
次のファイルとディレクトリを維持してください。
$ find -printf "%y %p\n"
d .
f ./tarfile # too new (dangerous location if important to keep)
d ./work
d ./work/dir 4
d ./work/dir5
d ./work/dir5/sub1
d ./work/dir5/sub2
d ./work/dir1
d ./work/dir2
f ./work/dir2/file1
f ./work/dir2/file2
d ./work/dir3
d ./backup
d ./backup/dir 4
d ./backup/dir1
d ./backup/dir2
f ./backup/dir2/file1
f ./backup/dir2/file2
d ./backup/dir3
これで空のディレクトリを削除します。次の方法は複雑ではなく、空のディレクトリツリー全体が削除されるまで繰り返す必要があります。より直接的な方法の提案を歓迎します。このrm
オプションは-d
空のディレクトリを削除します。
find -type d -exec rm -d {} +
一部の人々は、いくつかのディレクトリが空ではないと文句を言うでしょう。我々は次のような結果を得る。
$ find -printf "%y %p\n"
d .
f ./tarfile
d ./work
d ./work/dir5 # This is an empty directory
d ./work/dir2
f ./work/dir2/file1
f ./work/dir2/file2
d ./backup
d ./backup/dir2
f ./backup/dir2/file1
f ./backup/dir2/file2
繰り返す:
find -type d -exec rm -d {} +
結果を確認してください。
$ find -printf "%y %p\n"
d .
f ./tarfile # too new (dangerous location if important to keep)
d ./work
d ./work/dir2
f ./work/dir2/file1
f ./work/dir2/file2
d ./backup
d ./backup/dir2
f ./backup/dir2/file1
f ./backup/dir2/file2
ディレクトリツリーには、保護する必要がある項目のみが含まれます。