私はすべてを削除する方法について非常に多くの答えられた質問があることを知っていますファイルwithまたはwithout名前に特定の文字列、およびすべての削除方法に関するものサブフォルダwith名前に特定の文字列。
しかし、すべてのサブフォルダwithoutで名前を削除する方法に関する質問はありません。
それで、私が最近そのような問題に出くわしたので、この状況を助ける簡単なコマンドがありますか? bashスクリプトでも十分でしょう。
編集:
subfoldersによって、私は第1レベルのサブフォルダーのみを意味しました。文字列。
現在のディレクトリでfind
を起動し、それをサブディレクトリの最初のレベルに制限するとします。
find . -maxdepth 1
find
コマンドには、次のテストを無効にする便利なフラグ-not
(または!
)があります。そのため、notにサブストリングが含まれる名前を見つけるには、
-not -name "*substring*"
重要:現在のディレクトリ自体も除外する必要があります。そうしないと、現在のディレクトリ全体が削除されます。
-not -name "."
次に、ディレクトリのみをテストします。
-type d
そして、すべてがよさそうであれば、これらのディレクトリを削除します:
-exec rm -rf {} \;
「見つかったすべてのディレクトリに対して、このコマンドを実行します」と表示されます。 {}
は、ディレクトリ名のプレースホルダーです(フルパスを含むため、正しいパスで機能します)。 \;
は、実行するコマンドの終わりを示します。
要約:
find . -maxdepth 1 -not -name "*substring*" -not -name "." -type d -exec rm -rf {} \;
動作するはずです。ただし、最初に-exec
部分なしで試してください。
Bashシェルのextended glob演算子は、パターン否定を行うことができます。与えられた
$ tree .
.
├── subdir
│ ├── other file
│ └── somefile
├── subdirbar
│ ├── other file
│ └── somefile
├── subdirbaz
│ ├── other file
│ └── somefile
└── subdirfoo
├── other file
└── somefile
4 directories, 8 files
拡張グロビングが有効になっている場合(shopt -s extglob
)
$ rm -rf !(*foo*)
文字列foo
を含まないすべての最上位ディレクトリを(再帰的に)削除します。
$ tree
.
└── subdirfoo
├── other file
└── somefile
1 directory, 2 files
ただし、これはトップレベルにfoo
を含まない名前のfilesも削除します。 AFAIK bash拡張グロブはファイルとディレクトリを区別できませんが、zshはglob修飾子を提供します。与えられた
% tree
.
├── foofile
├── other file
├── somefile
├── subdir
│ ├── other file
│ └── somefile
├── subdirbar
│ ├── other file
│ └── somefile
├── subdirbaz
│ ├── other file
│ └── somefile
└── subdirfoo
├── other file
└── somefile
4 directories, 11 files
次にzsh
% setopt EXTENDED_GLOB
% ls -d (^(*foo*))
other file somefile subdir subdirbar subdirbaz
一方、(/)
ディレクトリ修飾子を追加する
% ls -d (^(*foo*))(/)
subdir subdirbar subdirbaz
そう
% rm -rf (^(*foo*))(/)
名前に文字列foo
が含まれないdirectoriesのみを削除し、プレーンファイルをそのまま残します。
% tree
.
├── foofile
├── other file
├── somefile
└── subdirfoo
├── other file
└── somefile
1 directory, 5 files