Kabuğumun ana dizindeki tüm alt dizinleri ziyaret etmesini istiyorum. Dizinlerde bir şeyler yapın, çıktıyı bir biriktirme dosyasına gönderin ve sonraki dizine geçin. Main Dir = / tmp Sub Dir = ABCD'yi (Dört alt dizin) göz önünde bulundurun
Kabuğumun ana dizindeki tüm alt dizinleri ziyaret etmesini istiyorum. Dizinlerde bir şeyler yapın, çıktıyı bir biriktirme dosyasına gönderin ve sonraki dizine geçin. Main Dir = / tmp Sub Dir = ABCD'yi (Dört alt dizin) göz önünde bulundurun
Yanıtlar:
Bir fordöngü kullanın :
for d in $(find /path/to/dir -maxdepth 1 -type d)
do
#Do something, the directory is accessible with $d:
echo $d
done >output_file
Yalnızca dizinin alt dizinlerini arar /path/to/dir. Dizin adlarında boşluk veya özel karakterler varsa yukarıdaki basit örneğin başarısız olacağını unutmayın. Daha güvenli bir yaklaşım:
find /tmp -maxdepth 1 -type d -print0 |
while IFS= read -rd '' dir; do echo "$dir"; done
Veya açık olarak bash:
for d in /path/to/dir/*; do
if [ -d "$d" ]; then
echo "$d"
fi
done
(bunun aksine find, dizinlere olan simgeleri de göz önünde bulundurduğunu ve gizli olanları hariç tuttuğunu unutmayın)
findböyle bir çıktıyı işlemeyle ilgili sınırlamaları ve riskleri belirtin.
date +"%m%d20%Y"| xargs echo echo $ d
date +"%m%d20%Y"| xargs echo echo $ d Beklenen sonuç tüm alt dizinlerden ls -ltr . Döngü üstünde çalışmıyor
Ben tam bir bashacemiyim, ama UN * X emektarıyım. Kuşkusuz bu Bash kabuk komut dosyasında yapılabilir, ancak eski günlerde bunu başardık find [-maxdepth <levels>] <start-dir> -exec <command> ;. man findBelki biri size bunu nasıl yapacağınızı söyleyene kadar bir oyun oynayabilir ve oynayabilirsiniz bash!
findkomut çalıştırmanın yükünü önler .
$(find...)Şeydir kötü uygulama .
Her alt dizinin altındaki dosya adlarını istediğiniz gibi görünüyor; ls -l | awkBu dosya adları boşluk ve / veya yeni satır içermektedir ne olur için, sağlam yeterli değil mi? Aşağıdakiler find, onlar için bir findşey yapamayanlar için bile işe -maxdepthyarar:
find . ! -name . -type d -prune -exec sh -c '
cd "$1" && \
find "." ! -name . -prune -type f
' {} {} \;
Ls, grep ve tr kullanarak da mümkündür
for dir in $(ls -1FA | grep / | tr -d /); do echo $dir/something; done
ls -1FA | grep / | tr -d / | while IFS= read -r TD; do echo $TD/something; done
du / sed, ls'iniz yukarıdaki seçeneklerden yoksun ise bir seçici olarak da kullanılabilir
du --max-depth=1 | sed -e 's/^.*\.\///' | grep -v '\.$'
Bu örneklerin gizli dizinleri döndürdüğünü ve üst ve geçerli dizinleri hariç tuttuğunu unutmayın.
lsher satıra bir dosya ( -1seçeneğin belirttiği gibi) yazar (bu nedenle yanıtlarınızda gereksizdir). Çıktısını Ayrıştırma (2) lskötü bir fikir olduğunu - bakınız bu ve bu . Dizinlerin adlarında boşluklar (veya yeni satırlar) varsa ilk yanıtınız başarısız olur ve adlarında yeni satırlar varsa bunların tümü başarısız olur. (3) Yapmamak "$dir"için iyi bir nedeniniz olmadığı sürece her zaman kabuk değişkenlerini (örn. ) Alıntılamalısınız ve ne yaptığınızı bildiğinizden emin olabilirsiniz.