毎日のスクリプトを使用して、フォルダ内のすべてのフォルダを削除する必要があります。その日付のフォルダを保存する必要があります。
「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