サブディレクトリのファイルとフォルダを繰り返し削除します。

サブディレクトリのファイルとフォルダを繰り返し削除します。

「転送」フォルダがあります。この転送フォルダには、「user1」、「user2」などのユーザーフォルダがあります。コンテンツ(つまり、ユーザーフォルダ内のすべてのファイルとフォルダ)を(定期的に)削除したいのですが、転送フォルダやユーザーフォルダは削除したくありません。

新しいユーザーが追加されるたびに、各新しいユーザーのフォルダに呼び出しを手動で追加せずにシェルスクリプト/コマンドを使用してこれを行うにはどうすればよいですか?

答え1

findこれを行うには、次のコマンドを使用できます。

find /path/to/transfer -mindepth 2 -delete

-mindepth 2引数は、find無視するディレクトリの最初の2つのレベルを指します。ディレクトリ自体とその中に直接存在するすべてのファイルとフォルダが検索されます。

-delete引数は単にfindすべてのファイルを削除するように指示します。

-mtime必要に応じて(たとえば)、いつでもより多くのパラメータを追加できます。

答え2

失敗した答え:

rm -R転送/ユーザー*/。

たとえば、

$ rm -R transfer/user*/.
rm: refusing to remove '.' or '..' directory: skipping 'transfer/user1/.'
$

すべてのユーザーコンテンツを削除し、user *ディレクトリは空白のままにします。 「ドット」/「ピリオド」/「現在のディレクトリ」は削除されませんが、その場所で繰り返し削除するための開始点として使用できます。

修正する:残念ながら、この回答の使用に関する提案を撤回する必要があります。実際に投稿する前にテストをしていましたが、ダメだというニュースを聞いてもう一度テストしてみると失敗しました。簡単に言えば、何も削除されませんでした。どうやら私が以前にテストを間違っていたのは間違いありませんでした。この問題に対処する方法を見つけましたが、更新があまりにも異なり、この回答に対する既存の意見が更新とうまく一致しないと判断し、別の(再テストした)ソリューションを別の回答として公開しました。

答え3

for x in transfer/user* ; do cd $x ; echo rm -R $( ls -1a | grep -v ^./$ | grep -v ^../$ ) ; cd ../.. ; done

単語なしでコマンドを再実行する前に、これが非常に良く見えることを確認してくださいecho

依存する前に徹底的にテストしたいです。同様のことにより、..削除するアイテムが(再帰的に)一致し、予期しない大規模なデータ損失が発生したケースが記憶されます。特に、cd $x失敗したが(権限の問題のために)正常に動作cd ../..し、rm -R上位レベルのディレクトリで実行されている場合は、間違った領域から繰り返し削除されやすいです。これがまさにこれが完全に証明されるまでこれを盲目的に信じることを非常に躊躇する理由です。

これはDebianでbashを使用してテストしたシステムでも機能しました。このシステムでは、ls -1a表示...ディレクトリの後にスラッシュが続きます。ls別の方法で動作する他のコマンドやシェルがある場合は、少し調整する必要があります。

したがって、進む前に必ず手動レビューが可能かどうかを検討することをお勧めします。 (もちろん、適切なバックアップが用意されていることを確認してください。削除されたユーザー削除スクリプトがありましたが、/users/$1他の人が引数なしでスクリプトを実行して構文を表示したいという状況について聞いたことがあります。これはどれくらいの時間がかかったのか驚いて助けを求め、バックアップが簡単に提供され、正常に悪用できました。)

関連情報