Dizine göre çıktıyı “bulmak”


34

findBir cpioişlem için belirli bir kök dizininde tüm dosyaları ve dizinleri tekrar tekrar listelemek için kullanmak isterim . Ancak, kök dizinin kendisinin yollarda görünmesini istemiyorum. Örneğin, şu anda alıyorum:

$ find diskimg
diskimg
diskimg/file1
diskimg/dir1
diskimg/dir1/file2

Ama almak isterdim

file1
dir1
dir1/file2

(Kökün de benim istediğim çıktıda olmadığına, ancak bununla kurtulmanın kolay olduğuna dikkat edin tail).

OS X’deyim ve eğer mümkünse herhangi bir fazladan araç (örneğin GNU bulma) yüklememeyi tercih ediyorum, çünkü yazdığım betiği diğer OS X kullanıcıları ile paylaşmak istiyorum.

Bunun cutkök listelemesini kesmek için yapılabileceğinin farkındayım , ancak bu yetersiz bir çözüm gibi görünüyor. Daha iyi bir çözüm var mı?


find diskimg/* | cut -d '/' -f2-
nik.shornikov

Yanıtlar:


18

Yapmaya çalıştığınız şey çok karmaşık değilse, bunu sed ile yapabilirsiniz:

find diskimg | sed -n 's|^diskimg/||p'

Veya cut:

find diskimg | cut -sd / -f 2-

komut için herhangi bir ayırıcı seçebilir (neredeyse), o yüzden: find diskimg | grep -v '^diskimg$' | sed -e 's|^diskimg/||'(not 'ayrıca,' -e 'de eklediğime dikkat edin) ve ^iyi bir uygulama (burada gerekli değil, her satırın buna sahip olduğundan emin olduğunuz için ... ama yine de iyi bir uygulama) , ve bazı cpu tasarrufu;))
Olivier Dulac

grep'siz başka bir yol: find diskimg | sed -e 's|^diskimg/*||' ('/ *', 0 bile herhangi bir sayıda '/' ile eşleşir)
Olivier Dulac

Bu cutkomut benim kullandığımdan daha temiz; Bunu sevdim. ( sedÇözümü de güzel, ama tekrarı diskimg/biraz talihsiz).
nneonneo

30

cd önce dizine:

cd diskimg && find . 

Tamamlandığında, kök dizininize geri döneceksiniz.

Bu durumda dosyalarınız ./ ile hazırlanır; Etrafında gördüğüm tek yol kullanmak olurdu cut:

{ cd diskimg && find .; } | tail -n +2 | cut -c 3-

Kabuğunuzun geçerli dizinini değiştirmekten kaçınmak için bir alt kabuk kullanın (bu, bir borunun sol tarafı zaten bir alt kabukta çalıştığından çıkışı boruya bağladığınızda gerekli değildir).

(cd diskimg && find .)

5
tamamlanması orijinal dir geri olmak: parantez ekleyin: (cd diskimg && find . ; ). Bu şekilde cd diskimg && find .bir alt kabukta yapılır: bu alt kabuk çıktığında, hangi dizinde olursanız olun kendi kabuğunuza geri dönersiniz.
Olivier Dulac

1
find *yararsız önek etrafında başka bir yoludur
nik.shornikov

23

Bir başkası, daha karmaşık ancak yalnızca benim cevabımdaki başka bir cevabım olan yaklaşımı kullanarak

find diskimg -mindepth 1 -printf '%P\n'

Tüm finddestek sürümleri değil printf.
jordanm

1
Şüphesiz; Benim OSX'im yok, öyle görünüyor. Kısmen neden başka bir çözüm önerdim.
Stephan

2
@Stephan - bir dahaki sefere bu tür cevapları tek bir cevapta birleştirebilirsin. Bunun gibi farklılıklar için çoklu cevaplar vermeye gerek yok.
slm

2
Sadece GNU finddestekliyor -printf, birçok BSD GNU'nun findbazı özelliklerini findkopyalarken, hiçbiri henüz kopyalamadı -printf(AFAIK).
Stéphane Chazelas

%Pgöreli yol için ne ihtiyaç vardı.
Fl0v0

4

realpathYardımcı programı kullanın :

find diskimg -exec realpath --relative-to diskimg {} \;

Düzgün - bana gösterdiğin için teşekkürler --relative-to.
nneonneo
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.