2013-07-30 22 views
9

İki dizin, mysql ve temp hariç, bir dizinden her şeyi silmesi gereken bir komut dosyası yazıyorum.Bash. Tüm dosyaları ve dizinleri siliniz ama bazıları

Bu denedim:

ls * | grep -v mysql | grep -v temp | xargs rm -rf 

ancak bu da ihtiyacım olmadığını, kendi adlarına mysql sahip tüm dosyaları tutar. Ayrıca başka dizinleri de silmez.

herhangi bir fikir?

Glob patterns can also contain pattern lists. A pattern list is a sequence 
of one or more patterns separated by either | or &. ... The following list 
describes valid sub-patterns. 

... 
!(pattern-list): 
    Matches any string that does not match the specified pattern-list. 
... 

Not: POSIX defined olduğunu

rm -rf !(mysql|init) 

:

cevap

21

Sen deneyebilirsiniz, önce onu test etmek için zaman ayırın!

echo !(mysql|init) 

Adding useful information: parametre değiştirme gibi usulüne uygun @mnagel tarafından da belirtildiği bazı test klasör oluşturmak, ya da sadece echo Ya eşleştirme değil aktif, sen/etkinleştirmek kullanarak devre dışı bırakmak olabilir eğer:

shopt extglob     # shows extglob status 
shopt -s extglob    # enables extglob 
shopt -u extglob    # disables extglob 
+0

Bir çekicilik gibi çalışır! Teşekkürler! (kesinlikle başka bir yerde test ediyordu, bir şeyleri kırmak istemiyor) – Bobo

+0

Eğer bu soruya cevap verirse, cevabı kabul edildi olarak işaretleyin. Her ikisi de başkalarının, sorunun yanıtlandığını bilmelerine izin verir, çünkü başkalarının size yardım etme çabalarını kabul ettiğinizi gösterir. Bir cevabı kabul etmek için, oylama oklarının altındaki onay işaretini tıklayın. – Rubens

+0

üzerinde çalışıyor. 1 dakika daha beklemek zorundayım. – Bobo

1

Mysql ve temp'ı yok sayıp sonra da rm -rf öğelerini kullanabilirsiniz.

find . ! -iname mysql ! -iname temp -exec rm -rf {} \; 
+4

, bu iki klasör içindeki dosyaları da siler. – Bobo

+0

Bu klasörler içindeki her şeyi silmemek için 'find. -maxdepth 1! -iname mysql! -iname temp -exec rm -rf {} \;' veya daha da iyi 'bulmak. -maxdepth 1! - iname mysql!-iname temp -delete' – mikewaters

2

Bu genellikle find için bir iştir. ([mysql adında veya tmp adında] ve üzerlerinde rm çağrı değildir . ancak alt dizinleri girişler bulabilir budur.)

find . -maxdepth 1 \! \(-name mysql -o -name temp \) -exec rm '{}' \; 

: Aşağıdaki komutu (eğer bir özyinelemeli silmek gerekiyorsa -rf ekleyin) Deneyin

+0

da bu iki klasör içindeki dosyaları siler – Bobo

+0

'maxdepth' seçeneği ile değil. Aşağıda belirtilen hiçbir şeyi içermeyen eşleşen dosyaların listesini almak için '-exec rm '{}' \;' öğesini kaldırın. – chrylis

+1

Bu, '.' yi de geri döndürür, böylece rm -Rf'yi çalıştırıyorsanız, potansiyel olarak, sizden daha fazlasını silebilirsiniz ... –

İlgili konular