Bir dizin ağacındaki tüm * .foo'ları nasıl kaldırırım?
rm -r *.foo
çalışmıyor.
Bir döngü deneyebilirim, ancak özyinelemeli genişlemeye ihtiyacı var:
for x in */*/.../*.foo
do rm $x
done
Bu da mümkün değil.
Bir dizin ağacındaki tüm * .foo'ları nasıl kaldırırım?
rm -r *.foo
çalışmıyor.
Bir döngü deneyebilirim, ancak özyinelemeli genişlemeye ihtiyacı var:
for x in */*/.../*.foo
do rm $x
done
Bu da mümkün değil.
Yanıtlar:
Kullanabilirsiniz find
:
find -name '*.foo' -delete
find . -name
?
man find
: hayır yolları verilirse, geçerli dizin kullanılır .
-exec
bu amaç için kullanılabilecek eylem var.
Oldukça yeni bir bash sürümünüz olduğunu varsayalım:
shopt -s globstar
rm -- **/*.foo
En kolay çözümlerden biri, find komutunu şu exec
parametreyle kullanmak olacaktır :
find /path/where/to/start/search -type f -name "*.foo" -exec rm {} \;
Bu * .foo adındaki tüm dosyaları arayacak ve her biri için rm {dosyaadı} yapacaktır.
Çok fazla dosyanız varsa, xargs
komutun kullanımı daha hızlı olabilir:
find /path/where/to/start/search -type f -name "*.foo" | xargs rm
Bu, tüm dosyaları bulur ve dosya adlarını rm komutunun arkasına koyar, dağıtımınızın / kabuğunuzun destekleyeceği komutun maksimum uzunluğuna kadar, bu nedenle çalıştırdığınızda şunu yaparsınız:
rm dir1/file1.foo dir1/file2.foo dir1/file3.foo
Tahmin edebileceğiniz gibi, rm
ikili sistemin daha az başlatılması gerekiyor, bu da daha hızlı bir seçenek haline geliyor.
| xargs
ile -print0 | xargs -0
. Varsayılan olarak, xargs girişini, herhangi bir dosya veya dizin adında boşluk varsa, istenmeyen sonuçlar doğurabilecek herhangi bir beyaz alana böler. Ekstra anahtarlar, find ve xmarks işlevlerinin dosya adlarında izin verilmeyen boş baytları, bunun yerine ayırıcı olarak kullanır.
xargs
ya -exec
da kullanmak daha evrenseldir.
chown
bunun yerine aynı sorudurrm
.