ファイルを削除するときに特定のファイルとディレクトリを除外する


11

私の最上位ディレクトリはdataです。data複数のディレクトリが含まれ、これらのディレクトリにはサブディレクトリがあります。data/一部のディレクトリ内のいくつかのファイルを除き、内部のすべてのファイルとディレクトリを削除する必要があります。

たとえば、データにはディレクトリ100とが含まれ101ます。私は維持したいa.txtb.txtのファイルに100/し、c.txtかつd.txt内のファイル101/内の他のすべてのファイルとディレクトリを除去しながら100101

例:

.
├── 100
   ├── a.txt
   ├── b.txt
   ├── c.txt
   └── d.txt
└── 101
    ├── a.txt
    ├── b.txt
    ├── c.txt
    └── d.txt

rm -rf !(a.txt|b.txt)コマンドを使用していますが、このコマンドを各ディレクトリに自動的に適用することはできません。

回答:


12

すでにわかったように、次のextglob機能で有効になっている機能を使用できます。

shopt -s extglob

これにより、一致を除外できるため、次のようなことができます。

rm 100/!([ab].txt) 101/!([cd].txt)

echo最初にテストすることをお勧めします。この例では、何の内部一致する100/ではないa.txtか、b.txtと何の内側101/ではないc.txtかとd.txt。同じルールが同様に100/適用さ102/れる場合、次のようにできます。

10[02]/!([ab].txt) # or
{100,102}/!([ab].txt)

100と101のディレクトリの例を挙げましたが、実際にはサブディレクトリの数はほぼ20です。メインフォルダに各ディレクトリ名を書き込まずに各ディレクトリに上記のコードを実装する方法はありますか?
ディープブルー

@deepblue質問(edit)でそれの正確な例を提供してください、それrmを指定したくない場合、どのディレクトリにどのファイルを保持するかをどのように知るべきかは特に不明です。
デザート

7

findこれに使用できます。あなたはでのテストを否定することができますfind-not!。これにより、一致が検出されるのではなく、除外されます。

保持するファイルの親ディレクトリ、特に現在のディレクトリ を削除しないように注意する必要があります。.そのため、削除する前に出力を十分に読んでください。

あなたの例に基づいて、dataディレクトリからこのようなことをすることができます。

find ! -path . ! -path ./100 ! -path ./101 ! -path "./100/[ab].txt" ! -path "./101/[cd].txt"

! -path ./path/to/dir削除を避けたい任意のパスにを追加します。のようなメタ文字を使用でき*ますが、"./path*dir"不要な展開を防ぐためなどに使用する場合は、必ず式を引用してください。

findデフォルトでは再帰的です。./100ここで見つからなくても、patternに一致しない限り、すべてのコンテンツが見つかります[ab].txt。保持したいすべての名前と一致できない場合は、別のテストを追加します。

! -path "./100/[ab].txt" ! -path ./100/foo

これは見つけることができませんa.txtか、b.txtまたはfoo、それが他のすべてのファイルを検索します。

必要なものが確認できたら-delete、最後に追加して、見つかったファイルを削除できます。

find ! -path . ! -path ./100 ! -path ./101 ! -path "./100/[ab].txt" ! -path "./101/[cd].txt" -delete
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.