1つを除くすべてのサブディレクトリを削除する


10

現在のディレクトリの下に複数のサブディレクトリがあり、そのうちの1つがAと呼ばれているとします。

BashでAを除くすべてのサブディレクトリを削除する方法は?

回答:


23

Bashは拡張グロビングを備えています(最初のテスト、次にエコーの削除)。

shopt -s extglob
echo rm -rf !(A)

(私が忘れる前に-CSHスタイルの履歴の完了を無効にする可能性があります。Bash3では、無視している間にバグがあります!(。set + H

サプライズでいっぱいなら+1バッシュ!時々彼らはこのようにいいです。
Aleksandr Levchuk 2010年

ワウは本当にとても素敵です!期待どおりに動作します。shopt | grep extプラグインが有効になっているかどうかを確認することができます。
danger89


10

何について:

mv A /tmp/
rm * -rf
mv /tmp/A .

これにより、他のコマンドのタイプミスの「怖さ」の一部が回避されます。


1
ツールが十分にスマートであることを期待する代わりに、正気なことをするための+1。それでも、ある夜、ちょうどLinuxを学んでいたとき、最初の再コンパイルを行う前にカーネルを/ tmpにコピーしました。成功しませんでしたが、古いファイルは消去されたので、「汗はありません、コピーがあります」と言っただけで、真夜中のcronタスクが/ tmpにあるすべてのファイルで1週間以上前に消去しました。私は再コンパイルする必要がありましたが、今度はそれを正しく行うか、再起動しないでください!
ハビエル

投稿されたベストアンサー:)
ウォーレン

3

何かのようなもの

find . -type d -not -name A -exec rm -ir {} \;

すべきです

編集する

それは本当にあるはずです

find . -type d -maxdepth 1 -not -name A -exec rm -ir {} \;

findA未満の再帰を防ぐため。


3
ただし、これによりA / fooやA / barなどのAの下のサブディレクトリも削除されますが、A / Aは保持されます。
TCampbell 2009年

涼しい!質問とanswert GET移行されたSOからSFに...しかし、上記の私の編集が失われた...
agnul

maxdepthとtype引数を次のように交換することをお勧めします。-maxdepth 1 -type d -not -name A -exec rm -ir {} \;
Spawnrider

1

私は通常、最初に正しいlsコマンドを実行することでこれを行います。私はUNIXマシンではありませんが、次のようなものです:

ls -lda "[^ A]"

正しくできたら、それをコマンドにパイプします

ls -lda "[^ A]" | xargs rm -rf

正規表現が間違っている場合は、自由に編集してください...



1

より柔軟になりたいが手動の場合は、次のようにします。

ls > /tmp/foo
edit /tmp/foo as you like
xargs -a /tmp/foo rm -r

そうすれば、一般的な変更を行うことができます。


1

ここに一つの方法があります。この種のことには注意してください、しかし、それは非常に強力なので、善悪にしか使用できません...

* -type d | grep -v "^ A" | xargs rm -rf

1

-print0を検索に渡し、-0をxargsに渡さずに-execとrmで示した人がいるため、findを使用しないでください。スペースや改行のあるファイル名では混乱します:

$ mkdir 'foo foo'
$ mkdir foo$'\n'foo 
$ find . -type d -exec rm -ir {} \;
rm: cannot remove directory `.'
rm: remove directory `./foo\nfoo'? y
find: `./foo\nfoo': No such file or directory
rm: remove directory `./foo foo'? y
find: `./foo foo': No such file or directory

代わりに、xargs -0を指定してfind -print0を使用し、 '-exec command {} +'を使用するか、findがサポートしている場合は-deleteを使用してください。



1

以前の例に加えて:

find -maxdepth 1 -type d -not -name A -not -name "." -exec rm -ir {} \;

あなたも行うことができます:

find some/subdir -mindepth 1 -maxdepth 1 -type d -not -name A -exec rm -ir {} \;

cd some/subdir最初にする必要を避けるために。

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