Find -name - xargs komutları, boşluklarla komuta alınmayan dosya adlarıyla sonuçlanır


26

Normalde, dosya adlarında boşluk olan dosyaları kaldırmak için şunu çalıştırmanız gerekir:

$ rm "file name"

ancak birden fazla dosyayı kaldırmak istersem, örneğin:

$ find . -name "*.txt" | xargs rm

Bu, içinde boşluk bulunan dosyaları silmez.


Burada tam tahmin: find -name "*\ *.txt" | xargs rmiki kelime dosyası için işe yarıyor mu?
Wanderer

Yanıtlar:


49

Boş sonlandırıcıları anlatabilir findve xargsikisini birden kullanabilirsiniz.

find . -name "*.txt" -print0 | xargs -0 rm

ya da (daha basit) kullanan dahili -deleteeylemfind

find . -name "*.txt" -delete

veya (teşekkürler kos)

find . -name "*.txt" -exec rm {} +

ikisi ARG_MAXde gerek olmadan sistemin sınırına uymalıdır xargs.


1
İki kez sertçe oyu kaldıramazsınız :) Bahsettiğinizden beri, ARG_MAXayrıca find . -name "*.txt" -exec rm {} \;"güvenli bir atış" olacağını da söyleyeceğim
kos

3
Böylece efendin söylediği gibi: her zaman xargs -0.
Joshua,

1
Süper önemli nokta: -print0son seçenek (ya da en azından sonra -name "*.txt") olmalı, aksi halde bu artık bunlarla sınırlı kalmayacak*.txt ...
Kev

1

Bu arada, bulmak dışında bir şey kullandıysanız, yeni satırları boş baytlarla değiştirmek için tr kullanabilirsiniz.

Örneğin. Bir sonraki liner, bir dizindeki en son değiştirilen 10 dosyayı, adlarında boşluk olsa bile siler.

ls -tp | grep -v / | head -n 10 | tr "\n" "\0" | xargs -0 rm


Evet, bu işe yarıyor.
Peter Mortensen

0

Xargs komutu, varsayılan olarak sınırlayıcı olarak sekmeleri, boşlukları ve yeni satırları kullanır. -D seçeneğiyle yalnızca yeni satır karakterlerini ('\ n') kullanmasını söyleyebilirsiniz:

find . -name "*.txt" | xargs -d '\n' rm

SO kaynak cevap .


Bu cevap BSD sistemleri (for ) -0yerine bahseder . Ubuntu ne kullanıyor? Burada kabul edilen cevap kullanır . Ne doğru? -dxargs-0
Peter Mortensen
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.