毎日のスクリプトを使用して、フォルダ内のすべてのフォルダを削除する必要があります。その日付のフォルダを保存する必要があります。
「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
./myfolder
findディレクトリとその内容から始めるように指示します。-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
別のコマンドにパイプします。