Dizinler dışındaki dosyalar arasında dolaşın


11

Herhangi bir alt dizinler hariç geçerli dizindeki her dosyaya bir şeyler yapmak için benim komut dosyası gerekir.

Örneğin, geçerli yolda, 5 dosya vardır, ancak 1 tanesi bir klasördür (bir alt dizin). Komut dosyam, söz konusu komut dosyasını çalıştırırken bağımsız değişken olarak verilen bir komutu etkinleştirmelidir. Yani "bash script wc -w", geçerli dizindeki her dosyanın kelime sayısını vermeli, ancak klasörlerin hiçbirini vermemelidir;

Şu anki senaryom:

#!/bin/bash
dir=`pwd`
for file in $dir/*
do
    $* $file
done

Sadece döngü için dizinleri hariç tutmam gerekiyor, ama nasıl olduğunu bilmiyorum.

Yanıtlar:


11
#!/bin/bash -

for file in "$dir"/*
do
  if [ ! -d "$file" ]; then
      "$@" "$file"
  fi
done

Ayrıca, symlink türündeki ve symlink'in tür dizini dosyasına (bu da muhtemelen istediğiniz gibi) çözümlediği dosyaları da hariç tuttuğunu unutmayın.

Alternatif (yorumlardan), yalnızca dosyaları kontrol edin:

for file in "$dir"/*
do
  if [ -f "$file" ]; then
      "$@" "$file"
  fi
done

@roaima iyi fikir!
Laktak

2
Kullanmak daha iyi if [ -f "$file" ]; then .... Bir dizin sadece normal dosyaları değil, soketleri ve simgeleri de döndürür.
JRFerguson

OP'nin sorusuna dayanan @JRFerguson, soket ve boruların dahil edilmesinin gerçekten kötü bir fikir olacağını söyleyebilirim. Semboliklere gelince, bunlar ! -dzaten örtülü olarak dahil edilmiştir .
roaima

Son betiğimde [-f $ dosya] kullandım. İf durumunda tırnak işareti eksikliğine dikkat edin. Hemen hemen her yerde $ dosya etrafında tırnak işaretleri vardı, ama benim komut dosyası çalışması için bunları silmek zorunda kaldı.
Tõnis Piip

3

Burada yapmanız gereken şey basitse (ve ana kabukta & c'de değişkenleri ayarlamayı içermiyorsa) for döngüsü kullanmanın bir alternatifidir.

Sen kullanabilirsiniz findile -execve kullanımı -maxdepth 1alt dizine recursing önlemek için.

[ -n "$1" ] && find "$dir" -type f -mindepth 1 -maxdepth 1 -exec "$@" "{}" \;

[ -n "$1" ]Komut herhangi argümanlar geçirdi değilken dizindeki tüm dosyaları yürütme orada kaçınmaktır.


2

Zsh'de, joker karakter eşleşmelerini dosya türüne göre kısıtlamak için glob niteleyicileri kullanabilirsiniz . Örneğin (.), kalıptan sonra eklemek normal dosyalarla sınırlar.

wc -w *(.)

Dosya adları ile başlayan baş edebilmek için -ya ., kullanım wc -c -- *(.N)veya wc -c ./*(.N). Normal dosyalara sembolik bağlantılar da eklemek istiyorsanız, bunu yapın *(-.).

Aşağıdaki gibi dosya tarafından filtrelemek için bazı farklı mekanizma kullanmak gerekir böylece diğer ortak kabukları, böyle özelliği var bir döngü içinde dosya türlerini test ya find.


0

Alt dizinler ('/') ve bağlantılar (@) hariç döngü için bass:

for f in `ls|egrep -v '/|@'`; do echo $f; done
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.