長すぎます。

長すぎます。

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

「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

答え2

バッシュを使って:

shopt -s extglob
rm -r myfolder/!(test2)/

例:

$ tree myfolder/
myfolder/
├── test1
│   └── file1
├── test2
│   └── file2
└── test3
    └── file3

$ echo rm -r myfolder/!(test2)
rm -r myfolder/test1 myfolder/test3
$ rm -r myfolder/!(test2)
$ tree myfolder/
myfolder/
└── test2
    └── file2

1 directory, 1 file

答え3

長すぎます。

find ./myfolder -mindepth 1 -maxdepth 1 -type d -not -name test2 \
     -exec echo rm -rf '{}' \;

ファイルリストに満足したら、エコーを削除してください。


使用すると-mindepth 1保証されますトップ選択したディレクトリがありません。

$ find ./myfolder -mindepth 1 -type d
./myfolder/test2
./myfolder/test2/one
./myfolder/test2/two
./myfolder/test
./myfolder/test/a1
./myfolder/test/a1/a2
./myfolder/test/a1/a2/a3

-not -name test2しかし意志はあります。いいえ以下の内部のサブディレクトリを避けてくださいtest2

$ find ./myfolder -mindepth 1 -type d -not -name 'test2'
./myfolder/test2/one
./myfolder/test2/two
./myfolder/test
./myfolder/test/a1
./myfolder/test/a1/a2
./myfolder/test/a1/a2/a3

これにはプラムのようなものが必要です。

$ find ./myfolder -mindepth 1 -name test2 -prune -o -type d -print
./myfolder/test
./myfolder/test/a1
./myfolder/test/a1/a2
./myfolder/test/a1/a2/a3

しかし、delete暗黙的に使用しないと、depth最長パスから削除が開始されます。

$ find ./myfolder -depth -mindepth 1 -name test2 -prune -o -type d -print
./myfolder/test/a1/a2/a3
./myfolder/test/a1/a2
./myfolder/test/a1
./myfolder/test

以下を使用するか、rm -rf実際に削除するには削除してください。echo

$ find ./myfolder -mindepth 1 -name test2 -prune -o -type d -exec echo rm -rf '{}' \;
rm -rf ./myfolder/test
rm -rf ./myfolder/test/a1
rm -rf ./myfolder/test/a1/a2
rm -rf ./myfolder/test/a1/a2/a3

または、返品maxdepth必要なものがディレクトリ(およびその中のすべて)を削除するだけであれば(echo実際に消去するには削除)を使用してください。

$ find ./myfolder -mindepth 1 -maxdepth 1 -type d -not -name test2 -exec echo rm -rf '{}' \;
rm -rf ./myfolder/test

-deleteディレクトリが空でない場合、Aはまだ失敗します。

$ find ./myfolder -mindepth 1 -maxdepth 1 -type d -not -name test2 -delete
find: cannot delete ‘./myfolder/test’: Directory not empty

答え4

要件が質問に記載されているレベル(深さ1以下)にのみ適用される場合、以下は別の簡単なオプションです。

ls myfolder/ | grep -v "test2" | xargs rm -r

詳細:

  • ls myfolder/myfolder/ディレクトリ内のすべてのフォルダとファイルの一覧表示
  • grep -v "test2"「test2」を除くすべてと一致します。
  • xargs rm -r前のコマンドの出力をrm -r別のコマンドにパイプします。

関連情報