“Zavallı adamın” ilgini çekebilir find
:
shopt -s globstar
shopt -s
s adında kabuk seçeneği (ler) ETS. globstar
Şöyle tanimlanirsa Bash (1) :
**
Ayarlanırsa, dosya adı / yol adı genişletme bağlamında kullanılan desen bir dosya [sic] ile sıfır veya daha fazla dizin ve alt dizinle eşleşir . Desenin ardından a gelirse /
, yalnızca dizinler ve alt dizinler eşleşir.
Yani, yaptıktan sonra shopt -s globstar
, aşağıdaki komutlardan herhangi biri:
ls -d1 - kaynak / ** # 'd'den sonraki karakter bir rakamdır.
ls -d - kaynak / ** | cat # yani, herhangi bir komuta boruya yazacaktır.
printf "% s \ n" kaynak / **
çıktı üretecek:
source/
source/fonts
source/fonts/fontello
source/images
source/images/bg1.png
source/images/eng.png
source/images/fra.png
Ne yazık ki, dizin adları da buna dahildir. Size yardımcı olabilecek bir az şey olduğunu bilmek
printf "%s\n" source/**/
çıktı üretecek:
source/
source/fonts
source/images
yani, sadece dizin adları. Sen, bir dosyaya komutları ilk seti birinin çıkışını yönlendirmek ikinci dosyaya yukarıdaki çıktısını yönlendirmek ve ardından kullanabilir comm
, diff
veya benzer bir şey, sadece sade bırakarak birinci gelen ikinci dosyayı çıkarmak dosyaları (dizin olmayanlar). Ama yapma.
Başka bir yaklaşım (bu daha iyi değil )
ls -d --file-type -- source/** | grep -v '/$'
Bu --file-type
seçenek,
her dizin adının sonunda (ve diğer (özel) dosya türlerinin uçlarındaki diğer karakterler) şu ls
şekilde görüntülenmesini söyler /
:
source // # Fazladan bir
kaynak eklendi kaynak / yazı tipi / # Bir tane eklendi
Kaynak / yazı / fontello
kaynak / resim / # Bir tane eklendi
kaynak / images / bg1.png
kaynak / images / eng.png
kaynak / images / fra.png
ve sonra grep -v '/$'
biten çizgileri kaldırır /
; yani, dizin adları. Maalesef, --file-type
seçenek POSIX tarafından belirtilmedi . Sürümünüz ls
desteklemiyorsa kullanın -F
. Bu, bazı kişilerin can sıkıcı bulduğu yürütülebilir dosya adlarının sonunda --file-type
bir de görüntülemesi dışında gibidir *
. Bunları aşağıdakilerle ortadan kaldırabilirsiniz sed
:
ls -dF -- source/** | sed -e '/\/$/d' -e 's/\*$//'
Tüm dosyalarla (ve yalnızca dosyalarla) bir şey yapmak istiyorsanız,
Kaynaktaki f için / **
yapmak
[-f "$ f"] ise
sonra
Düz dosyalara uygulanacak komutları buraya ekleyin.
fi
tamam
Notlar:
- Bir
ls
terminale çıkış yapıldığında ve -l
( l ong) modunda olmadığında, satır başına birden çok ad yazar (adlar çok uzun değilse). -1
(Bir) belirterek veya çıktıyı bir dosyaya veya boruya yönlendirerek satır başına bir ad yazmaya zorlayabilirsiniz .
- Muhtemelen gerçekten gerekmez
--
içinde ls
kimin içeriği oluşturduğunuz bir dizin listeleme ediyoruz beri komutları. *
Bilinmeyen bir dizinde listeleme yaparken , ile başlayan dosya adlarına karşı koruma olarak kullanmalısınız -
.
- Çıktısını ayrıştırmaya çalışmayın
ls
.
globstar
Kabuk seçeneği POSIX tarafından tanımlanabilecek olmadığı görülüyor. (Aslında, POSIX'in herhangi bir kabuk seçeneğini tanıdığından emin değilim .) Bir bash
izm gibi görünse de , dikkatli olun - bash'ın tüm sürümlerinde olmayabilir.
Alt dizinleri varsa fonts
veya varsa images
, **
hepsini, özyineli olarak, aşağıya doğru listeler. Derinliği sınırlamanın bir (biraz bulanık ve güvenilmez) yolu
ls -d --file-type -- source/** | grep -v '\(/.*\)\{3\}'
üç veya daha fazla /
karakter içeren satırları siler .
find
yanlış kullanmanın da yolları var ; özellikle koşuyorsanızfor file in $(find ...)
, bunlardan birine çarptısınız).