長すぎます。

長すぎます。

毎日のスクリプトを使用して、フォルダ内のすべてのフォルダを削除する必要があります。その日付のフォルダを保存する必要があります。

「myfolder」フォルダには「test1」、「test2」、「test3」という3つのサブフォルダがあり、「test2」を除くすべてのサブフォルダを削除する必要があります。

ここで正しい名前を一致させようとしています。

find /home/myfolder -type d ! -name 'test2' | xargs rm -rf

または

find /home/myfolder -type d ! -name 'test2' -delete

このコマンドは常にデフォルトフォルダ「myfolder」を削除しようとします!これを避ける方法はありますか?

ベストアンサー1

./myfolderこのフォルダを除くすべてのフォルダが削除され、./myfolder/test2そのフォルダのすべての内容が保存されます。

find ./myfolder -mindepth 1 ! -regex '^./myfolder/test2\(/.*\)?' -delete

どのように動作しますか?

  • find検索コマンドを開始します。
  • ./myfolder./myfolderfindディレクトリとその内容から始めるように指示します。

  • -mindepth 1 それ自体は一致せず、./myfolderその下のファイルとディレクトリのみが一致します。

  • ! -regex '^./myfolder/test2\(/.*\)?'!正規表現に一致するすべてのファイルまたはディレクトリを除外するようにfindに指示します^./myfolder/test2\(/.*\)?^パス名の先頭に一致します。この式は、 (/.*\)?(a) スラッシュの後に続く項目、または (b) まったく一致しない項目と一致します。

  • -delete 一致する(つまり、除外されていない)ファイルを削除するようにfindに指示します。

はい

次のディレクトリ構造を考えてみましょう。

$ find ./myfolder
./myfolder
./myfolder/test1
./myfolder/test1/dir1
./myfolder/test1/dir1/test2
./myfolder/test1/dir1/test2/file4
./myfolder/test1/file1
./myfolder/test3
./myfolder/test3/file3
./myfolder/test2
./myfolder/test2/file2
./myfolder/test2/dir2

-delete一致するものを確認するには、findコマンド(なし)を実行できます。

$ find ./myfolder -mindepth 1 ! -regex '^./myfolder/test2\(/.*\)?'
./myfolder/test1
./myfolder/test1/dir1
./myfolder/test1/dir1/test2
./myfolder/test1/dir1/test2/file4
./myfolder/test1/file1
./myfolder/test3
./myfolder/test3/file3

残りのファイルを見ると、これがうまくいくかどうかを確認できます。

$ find ./myfolder
./myfolder
./myfolder/test2
./myfolder/test2/file2
./myfolder/test2/dir2

おすすめ記事