これにより、 ./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
find コマンドを実行できます (-delete
なし) ) 一致するものを確認するには:
$ 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
バッシュの使用:
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
tl;dr
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
そのためには、prune のようなものが必要です:
$ 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
ディレクトリが空でない場合は失敗します:
$ find ./myfolder -mindepth 1 -maxdepth 1 -type d -not -name test2 -delete
find: cannot delete ‘./myfolder/test’: Directory not empty