web-dev-qa-db-ja.com

名前に指定された文字列を持たないすべての第1レベルのサブフォルダーを削除する方法

私はすべてを削除する方法について非常に多くの答えられた質問があることを知っていますファイルwithまたはwithout名前に特定の文字列、およびすべての削除方法に関するものサブフォルダwith名前に特定の文字列。

しかし、すべてのサブフォルダwithoutで名前を削除する方法に関する質問はありません。

それで、私が最近そのような問題に出くわしたので、この状況を助ける簡単なコマンドがありますか? bashスクリプトでも十分でしょう。

編集

subfoldersによって、私は第1レベルのサブフォルダーのみを意味しました。文字列。

3
PyGeek03

現在のディレクトリで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部分なしで試してください。

9
Jos

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
4
steeldriver