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.