Unix “find” da önde gelen “./” nasıl şeritlenir?


140
find . -type f -print

çıktılar

./file1
./file2
./file3

Yazdırmanın herhangi bir yolu

file1
file2
file3

?


1
Eğer kullanılırsa -exec /path/to/myscript.sh {} Gözlerinde farklı find, -printf '%P\n'çalışmıyor. Bunun yerine, ./senaryo içinde chomping önek yapmak zorunda :p=${1#"./"}
truthadjustr

Sadece tek bir dosya için yapıyorsanız:f=`find . -name migration`; echo ${f/.\//}
masterxilo

Yanıtlar:


38

Yalnızca geçerli dizindeyse

find * -type f -print

İstediğin bu mu?


21
Bu, nokta ile başlayan isimleri olan dosyaları özleyecektir.
Sean

2
Kötü, kabuk ayarlarına bağlı olarak * "gizli" dosyalara / dizinlere göre değerlendirilemez - dot (.) İle başlayanlar bu komutu ana dizinde çalıştırmayı deneyin, sonra sadece "find -type f" komutunu deneyin ve farkı görün .
Ilia K.

35
Daha ilgili bir endişe '*' karakterinin kabuk tarafından değerlendirilmesi. Etkili bir tür kötü amaçlı kod yerleştirme durumunuz var. '--Exec rm' adında bir dosya ve 'zzzz;' adında başka bir dosya oluşturmak önemsizdir. Elveda dosyaları.
CWF

6
Bu güvensiz. Bir dosya adı kısa çizgi ile başlıyorsa, dosya bulma seçeneği olarak değerlendirilir ve başarısız olabilir veya potansiyel olarak zarar verebilir.
Dale Anderson

4
Neden -printgerekli? Bu bayrak olmadan aynı sonucu verdi.
user13107

239

Yalnızca geçerli dizinin altındaki normal dosyaları bulun ve " ./" öneki olmadan yazdırın :

find -type f -printf '%P\n'

İnsan bul, -printfformat açıklaması :

% P Dosyanın adı, altında bulunduğu komut satırı bağımsız değişkeninin adı ile kaldırıldı.


18
+1 Sürümünüz finddestekliyorsa iyi bir çözümdür -printf(hepsi desteklemez ).
Todd Owen

2
Todd'un dediği gibi, ama daha doğrusu: POSIX 7 değil
Ciro Santilli 法轮功 冠状 病 六四 事件 法轮功

8
Desteklenir veya desteklenmezse, kesinlikle kabul edilen yanıttan daha güvenlidir.
Dale Anderson

10
Sen kullanabilirsiniz \0yerine \nkadar boruya bunun için isterseniz xargs -0(örneğin durumda dosya beyazboşluk olarak), örneğinfind -type f -printf '%P\0' | xargs -0 head
seanf

1
@Quanlong, eğer macOS üzerinde çalışır brew install findutils;)
blockloop

58

Sed kullan

find . | sed "s|^\./||"

2
Bu benim tercih ettiğim çözüm; POSIX uyumludur (hemen hemen her yerde, hatta gömülü sistemlerde bile çalışır), çok kısa ve beklenmedik davranışlarla sonuçlanması olası değildir. Bu kabul edilen cevap olmalı.
Jody Bruchon

6
Bu nasıl birleştirilir find -exec?
Paul Wintz

find -exec sh -c "echo {} | sed 's|^\./||'" \; veya find -exec sh -c "sed 's|^\./||' <<< '{}'" \;
xenithorb

12

daha kısa olabilir

find * -type f

2> /dev/nullKomut boş bir dizinde çalıştırıldığında bildirilen hatayı yoksaymak daha iyi .
neevek

2

Sıyırma başka yolu ./kullanmaktır cutgibi:

find -type f | cut -c3-

Daha fazla açıklama burada bulunabilir


2

. / 'İ soymanın başka bir yolu

find * -type d -maxdepth 0

Bu kod, sorunun nasıl ve neden çözüldüğüne dair bir açıklama da dahil olmak üzere soruyu çözebilir, ancak gönderinizin kalitesini artırmaya yardımcı olabilir ve muhtemelen daha fazla oyla sonuçlanır. Sadece şimdi soran kişi için değil, gelecekte okuyucular için soruyu cevapladığınızı unutmayın. Lütfen açıklama eklemek için cevabınızı düzenleyin ve hangi sınırlamaların ve varsayımların geçerli olduğunu belirtin.
David Buck

2

OSX'de -printfseçenek bulunmadığından find, OSX bulmasında çalışan bir komut, birisinin vb gnu findkullanarak yüklemek istememesi durumunda brew:

find . -type f -execdir printf '%s\n' {} + 

1
Ne yazık ki bu, ara alt dizinler de dahil olmak üzere bulunan her dosyanın tüm yolunu keser ve sadece dosya adını yazdırır.
PLL

1
Haklısın. Bu çözüm yalnızca geçerli dizindeki dosyalar için iyidir. İç içe geçmiş dosyalar için kullanmamız find . -type f -exec bash -c 'for f; do echo "${f#./}"; done' {} +
gerekenler
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.