GNU/Linux >> Linux の 問題 >  >> Linux

特定の名前のフォルダーを除く、フォルダー内のすべてのフォルダーを削除します

これにより、 ./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

Linux
  1. Linuxで1つの特定のファイルを除いてフォルダ内のすべてのファイルを削除する方法

  2. 検索で特定のサブディレクトリを除くすべてのファイルを削除しますか?

  3. 最後の(最新の)20を除くフォルダ内のすべてのファイルを削除しますか?

  1. 特定のフォルダ内の特定の拡張子を持つすべてのファイルを削除するにはどうすればよいですか?

  2. 特定のフォルダから1つの名前付きファイルを除くすべてのファイルを削除するにはどうすればよいですか?

  3. 1日より古い/tmp内のすべてのファイルとフォルダを削除しますか?

  1. Linuxで777権限を持つすべてのファイル/フォルダを見つける方法は?

  2. 文字列を含む名前のすべてのファイルを検索

  3. X よりも古いすべてのファイルを含むディレクトリを検索しますか?