Son zamanlarda, bir dizindeki belirli bir desenle eşleşenler dışındaki tüm dosyaları / klasörleri silme göreviyle karşı karşıya kaldım. Bu yüzden işi yapmak için tek satırlık bir unix komutu hazırladım. Sadece bir satır mı olmalı? Sanmıyorum, ama kesinlikle bu şekilde daha havalı!
Sorun oldukça basit olsa da, çözümümün ne kadar karmaşık olduğuna biraz şaşırdım. İşte kullandığım komut; NOT: Bu, satır besleme karakterleri içeren dosya adlarını işlemediğinden (durumumda önemli olmayan) kötü bir çözümdür.
ls | grep -v PATTERN | xargs -n1 -IREPLACE rm -rf REPLACE
PATTERN ile eşleşen klasörlere tekrar okumak istemediğim için "find" komutunu kullanmadım. Örneğin, aşağıdaki dosya yapısını göz önünde bulundurun:
file_foo.txt
first_dir
|
+--> contents
+--> ...
foo_dir
|
+--> anotherfile.txt
+--> morefiles.log
foo_file.txt
somefile.txt
Desen "foo" kullanılması sadece "first_dir" (ve elbette 's içeriği) ve "somefile.txt" (kaldırmalısınız değil "anotherfile.txt" veya "morefiles.log").
Soru, bunu başarmanın daha iyi (daha zarif ve doğru) yolları var mı?
EDIT:
Son zamanlarda dikkatimi "bulmak" daha iyi bir seçenek olabilir getirildi :
find * -maxdepth 0 ! -name PATTERN -print0 | xargs -0n1 rm -rf
Bu çözüm, satır besleme karakterleri içeren yolları doğru şekilde işler.