Adlarında boşluk bulunan dosyaları silme


10

Adlarında boşluk olan tüm dosyaları silmeye çalışıyorum. Aşağıdaki komutu kullanıyorum. Ama bu bana bir hata veriyor

Komut: ls | egrep '. ' | xargs rm

Burada sadece ls | egrep '. 'komut kullanıyorsam , dosya adlarında boşluk olan tüm dosya adını veriyor. Ama ben rm çıktısını geçmek çalışırken, tüm boşluklar (önde gelen veya sondaki) silinir. Bu yüzden komutum düzgün bir şekilde yürütülmüyor.

Adında en az bir boşluk bulunan dosyanın silinmesine ilişkin herhangi bir işaretçi var mı?

Yanıtlar:


29

Komutta standart globbing kullanabilirsiniz rm:

rm -- *\ *

Bu, adı boşluk içeren tüm dosyaları silecektir; boşluk kaçar, böylece kabuk onu ayırıcı olarak yorumlamaz. Eklemek --, tire ile başlayan dosya adlarıyla ilgili sorunları önleyecektir (bunlar tarafından argüman olarak yorumlanmayacaktır rm).

Her dosyayı silinmeden önce onaylamak istiyorsanız, -iseçeneği ekleyin :

rm -i -- *\ *

4
echoYazım hatalarından korunmak için bunu kesinlikle ilk önce çalıştırmak isteyeceksiniz . echoÖnde ekleyin ve kaldıracağı tüm dosyaları yazdırın.
Riking

1
Anuj, bunun en yüksek oylara sahip olmasının nedeni find, güçlü olmasına rağmen , bazen tavuğu bir makineli tüfekle öldürmenize gerek olmamasıdır. UNIX yöneticileri genellikle çare olmaz find(örneğin) "harfi ile başlayan tüm dosyaları kaldırmak" için ... bir sadece olurdu rm A*. Aynı şekilde boşluk içeren dosyaları kaldırmak için rm işi yapabilir. Başka bir deyişle, yer görünmez olduğu ve özel olarak kabuk tarafından işlendiği için aldanmayın. Stephen Kitt'in yaptığı gibi ondan kaçın ve onu başka bir karakter gibi düşünebilirsiniz.
Mike S

14

lsÇıktıyı ayrıştırmaktan kaçınırdım

Neden olmasın :

find . -type f -name '* *' -delete

rm:-) ile sorun değil .

Her ne kadar bu özyinelemeli olsa da ve yorumlarda belirtildiği gibi geçerli dizinde ve iç içe dizinlerde boşluk olan tüm dosyaları siler.


4
(1) -name '* *'normal ifade yerine kullanabilirsiniz ; ve (2) -print0 | xargs -0 rm -i@ StephenKitt'in endişesini gidermek için kullanabilirsiniz .
Kevin

1
Gerek yok xargs. Sadece kullanın-exec rm -i '{}' +
R. .. GitHub DURDURMAK BUZ

1
@Mhmd 8 bitlik bir oyun konsolundan daha fazla tuzak var. mywiki.wooledge.org/ParsingLs
Daenyth

1
Alt dizinlerden kaçınmak istiyorsanız, kullanın find . -maxdepth 1 -name '* *' -delete.
Mikkel

1
@BenjaminW. sabit mi?
solsTiCe

6

Bu varsayalım adı "garip dosya"

Birinci çözüm

rm strange\ file

çözüm iki

rm "strange file"

çözüm üç

ls -i "strange file"

o inode görüyorsun

find . -inum "numberoofinode" -exec rm {} \;

Çok garip dosya isimleri durumunda

!-filename or --filename

kullanım

rm ./'!-filename'

4

itibaren man xargs

xargs, boşluklar (çift veya tek tırnak veya ters eğik çizgi ile korunabilir) veya yeni satırlarla sınırlandırılmış standart girdideki öğeleri okur ve komutu (varsayılan olarak / bin / echo'dur) takip eden ilk bağımsız değişkenlerle bir veya daha fazla kez yürütür standart girdiden okunan öğelere göre. Standart girişteki boş satırlar yoksayılır.

Xargs sınırlayıcısını yeni bir satıra değiştirerek ilk komutunuzu düzeltebiliriz:

ls | egrep '. ' | xargs -d '\n' rm (bunu yapma ... okumaya devam edin)

Ancak dosya adı bir satırsonu içeriyorsa ne olur?

touch "filename with blanks and newline"

Çünkü Unix dosya adları boşlukları ve yeni satır içerebilir , bu varsayılan davranışı genellikle problemlidir; boşluklar ve / veya satırsonu içeren dosya adları xargs tarafından yanlış işlenir. Bu durumlarda , bu tür sorunları önleyen -0 seçeneğini kullanmak daha iyidir .

ls gerçekten bir insan tarafından doğrudan tüketim için bir araçtır , bunun yerine finddosya adlarını boş bir karakterle ( -print0) ayırabilen komutu kullanmamız gerekir . Ayrıca grep'e input ( -z) ve output ( -Z) öğelerini ayırmak için null karakter kullanmasını söylememiz gerekir . Son olarak, xargs'a boş karakterler ( -0) kullanmasını söyleriz

find . -type f -print0 | egrep '. ' -z -Z | xargs -0 rm



-1

Bu şekilde yapmak için -Zgrep -0seçeneğine ve xargs seçeneğine ihtiyacınız olacak . Ama bu şekilde yapmazdım ( lsiş için doğru araç değil, bilgisayarın çıktısını okuması için birçok sorun var).

Daha iyi bir yol için diğer cevaplara bakın.


Ayrıca

ls | …eşittir ls -d *veecho * | …

Hepsinin problemleri var. Bu nedenle böyle kullanmayın ls, başka bir cevaptan bir çözüm kullanın.


Ayrıca ls *borular çıktısı dosya adlarını yeni satır sınırlanmış. echo(en azından bazı echouygulamalar) ters eğik çizgi dizilerini genişletir. grep -ZNUL ile ayrılmış dosya adları yazmak içindir -l, burada yardımcı olmaz. İsterseniz -z, çoğu lsuygulamada NUL sınırlandırılmış dosya adlarının çıktısı alma seçeneği olmadığından bu da yardımcı olmaz . Kişi böyle bir şey yapabilirdi printf '%s\0' * | grep -z ' ' | xargs -r0 rm -f.
Stéphane Chazelas

1
@Kusalananda Sanırım düzelttim.
ctrl-alt-delor
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.