Ls komutundan klasör önekini kaldırmak mümkün mü


12

Bir bash betiğindeyim ve tüm dosyaların listesini almak istiyorum (tüm jar dosyalarını söyleyelim). Komutu çalıştırıyorum ls -1 lib/*.jarve çıktıyı alıyorum:

lib/mylib_1.jar
lib/mylib_2.jar
...

Aşağıdaki çıktıya sahip olmak için herhangi bir seçenek var mı:

mylib_1.jar
mylib_2.jar
...

Daha cd libönce yapmak bir döngüde olduğum ve döngü içinde yapmak istediğim işlemler için üst klasörde olması gereken bir seçenek değil.

Yazarak bilgi bulmaya çalıştım man lsama çözüm bulamadım.

Başka bir komuta sahip bir çözüm, onu benim lsemirime ya da kendi kendine yeterli tutabildiğim sürece iyi olurdu .


Bu dosyaların isimleriyle ne yapıyorsunuz? Bunları sadece terminale mi listeliyorsunuz yoksa başka bir programa veya komut dosyasına mı aktarıyorsunuz (tek tek mi yoksa liste olarak mı)? Bunu işlemenin doğru yolu dosya adlarının nasıl kullanıldığına bağlıdır.
Kusalananda

Fikir, çok modüllü bir java projesinde üçüncü taraf kütüphaneleri hakkında bazı istatistikler yapmaktı. Sadece listeyi istedim ve sonra bir tür ve uniq yapmak
рüффп

Yanıtlar:


19

Yerine ls ayrıştırma kullanmanız gereken findyerine. Ardından basename, önde gelen dizinleri çıkarmak için her dosyada da yürütebilirsiniz :

find lib/ -name '*.jar' -exec basename {} \;

Tamam bu şekilde benim için de mükemmel.
рüффп

3
Ayrıca -maxdepthseçeneğe bakın .

13

GNU ile her bir dosya findiçin çalıştırmaya gerek yoktur basename, bu çok daha hızlı olacaktır (özellikle çok fazla dosya varsa):

find lib -name '*.jar' -printf '%P\n'

11

Peki (cd lib && echo *.jar), dosya adlarında boşluk veya özel karakterler yok varsayarak. Üst komut dosyası dizini asla değiştirmez.


Alanlar da sorun olmayacak.
terdon

Bu iyi bir fikir ve muhtemelen en hızlı seçenek olacak. Ben yapacağını printf '%s\n' *.jarfarklı bir çizgi gerçi her dosyayı alır.
Graeme

Hatta printf '%s\0' *.jarboşluk sorunlarını ortadan kaldırmak için bile (bu Q olmasa da).
Graeme

5

Josh Jolly'nin cevabında söylediği gibi, asla ayrışmamalı ls, onun cevabındaki yaklaşımı kullanmamalısınız. Yine de, awkdosya adlarından yolları kaldırmak için bir çözüm, sadece ls ile kullanmayın:

find . | awk -F'/' '{print $NF}'

-F'/'Setleri alan ayırıcı için /hangi son alan, yani $NF, dosya adı olacaktır.


1

findgitmek için yol muhtemelen, ama eğer gerçekten, gerçekten yapmak (değil mi) kapalı şerit istediğiniz lib/dan ls -1, şunları kullanabilirsiniz sed:

$ ls -1 lib/*.jar | sed 's#^lib/##'
mylib_1.jar
mylib_2.jar

0

Bunu, --max-args (veya daha kısa diğer ad -n) parametresine sahip xargs kullanarak yapabilirsiniz :

ls --quoting-style=c -1 lib/*.jar | xargs --max-args 1 basename ls --quoting-style=c -1 lib/*.jar | xargs -n 1 basename

--quoting-style=cDosya adlarındaki boşlukların xargs'ları kapatmamasını sağlamak için kullandığımızı unutmayın .


Fark etmedim. Teşekkür ederim! Bu taş başka bir yığın borsasında bulundu. Ls sonuçlarına --quoting-style = c ile tırnak ekleyebilirsiniz. Sonuçta elde edilen tam komut şöyle olur: `ls --quoting-style = c -1 lib / *. Jar | xargs --max-args 1 basename`
yoni

-1

Sorgunuzu çözmenin alternatif bir yolu tüm dosyaları listelemektir ls -R. Yalnızca .jar dosyalarını listelemek için ls komutunun çıktısını grep ile birleştirin. Sorgunuz için aynısını yapmak için aşağıdaki komutu kullanabilirsiniz:

ls -R lib | grep jar| grep -v jar*

Jar dosyalarını da içeren bir alt dizin veya örneğin "jar-jars.txt" adlı bir dosya varsa, bu kötü bir şekilde başarısız olur.
Jules

grep -v jar *, alıntılanan örneğiniz gibi adlandırılmış dosyayla sonuçları filtreleyecektir.
joshi.mohit86

doğru. ayrıca amaçlanan tüm dosyaları filtreleyecektir. Şimdi tekrar bakıyorum, önerdiğiniz komutun aslında herhangi bir çıktı üreteceği hiçbir koşul göremiyorum ...
Jules

Hayır, gibi dosyaları görüntüler mylib_2.jarve gibi dosyaları filtreler list-of-jars.txt.
joshi.mohit86

Hayır. Sadece denedim. find development -name '*.jar' | wc -l-> 70. ls -R development | grep jar| grep -v jar*-> hiç çıkış yok.
Jules
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.