Biri hariç tüm alt dizinleri sil


10

Geçerli dizinin altında birden çok alt dizin olduğunu ve birinin A olarak adlandırıldığını varsayalım.

Bash ile A dışındaki tüm alt dizinleri nasıl silebilirim?

Yanıtlar:


23

Bash globbing'i uzattı (ilk test, daha sonra yankıyı kaldırın):

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

(unutmadan - CSH stil geçmişi tamamlamasını devre dışı bırakabilirsiniz, Bash3'te yok sayılırken bir hata var! (. set + H

+1 Bash sürprizlerle doluysa! Bazen böyle güzeller.
Aleksandr Levchuk

Wauw gerçekten çok güzel! Beklendiği gibi çalışır. İle shopt | grep extEklentinin etkin olup olmadığını görebilirsiniz.
danger89

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

10

Ne dersin:

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

Bu, diğer komutlardaki yazım hatası "kıtlığını" önler.


1
+1 araçların yeterince akıllı olmasını ummak yerine akıllıca bir şey yapmak için. yine de, bir gece, sadece Linux öğrenirken, ilk yeniden derlememi yapmadan önce çekirdeği / tmp'ye kopyaladım. başarılı olmadı, ancak eskisini sildim, bu yüzden 'ter yok, bir kopyam var' dedim, sadece bir gece yarısı cron görevinin / tmp içinde bir haftadan fazla her dosyayla sildiğini bulmak için! tekrar derlemek zorunda kaldı ve bu sefer doğru yapmak, ya da benim için hiçbir yeniden başlatma!
Javier

en iyi cevap gönderildi :)
warren

3

Gibi bir şey

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

yapmak gerekir.

Düzenle

Gerçekten olmalı

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

findA'nın altında tekrarlanmasını önlemek için.


3
Ancak bu, A / foo ve A / bar gibi A'nın altındaki tüm alt dizinleri de kaldıracak, ancak A / A'yı koruyacaktır.
TCampbell

Güzel! Sorular ve cevaplar SO'dan SF'ye taşındı ... ama yukarıdaki düzenlemem kayboldu ...
agnul

Maxdepth'i değiştirmek ve bunun gibi argümanları yazmak daha iyi olmalıdır: find. -maxdepth 1 -type d -not -name A -exec rm -ir {} \;
Spawnrider

1

genellikle ilk önce doğru bir ls komutu çalışarak bunu yapmak. bir unix makinede değilim, ama şöyle bir şey:

ls -lda "[^ A]"

Bir kez doğru olsun, bir komuta boru

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

Düzenli ifademi yanlış yapmışsam yukarıdaki düzenlemeyi çekinmeyin ...



1

Daha esnek ancak manuel olmak istiyorsanız şunları yapabilirsiniz:

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

Bu şekilde genel munging yapabilirsiniz.


1

İşte bir yol. Bu tür şeylere dikkat edin, ancak o kadar güçlü ki, sadece iyi ya da kötü için kullanılabilir ...

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

1

Bazı kişilerin bulmak için -print0 ve -0 ile xargs arasında geçiş yapmadan -exec ve rm ile gösterdikleri için find komutunu kullanmayın. Boşluk veya yeni satır içeren dosya adları üzerinde karışacaktır:

$ 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

Bunun yerine xargs -0, '-exec komutu {} +' ile find -print0 kullanın veya bulmanız destekliyorsa -delete'yi kullanın.



1

Önceki örneğe ek olarak:

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

ayrıca şunları da yapabilirsiniz:

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

önce yapmak zorunda kalmamak için cd some/subdir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.