Unix kabuk betiğindeki tüm alt dizinleri gezin ve bir şeyler yapın


17

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


2
Tamam, lütfen bize betiğini şu ana kadar göster. Hangi kısmı size sorun çıkartıyor?
terdon

Yanıtlar:


22

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)


1
en azından findböyle bir çıktıyı işlemeyle ilgili sınırlamaları ve riskleri belirtin.
Stéphane Chazelas

Merhaba ... $ için döngü için aşağıda çalıştırmak için çalıştı (find / backup / ASHISH -maxdepth 1 -type d) do ls -l | awk '{print $ 9}' | grep CC * _ date +"%m%d20%Y"| xargs echo echo $ d
Ashish

Merhaba ... Aşağıda döngü için denedim. $ d için (find / backup / ASHISH -maxdepth 1 -type d) do ls -l | awk '{print $ 9}' | grep CC * _ date +"%m%d20%Y"| xargs echo echo $ d Beklenen sonuç tüm alt dizinlerden ls -ltr . Döngü üstünde çalışmıyor
Ashish

1

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!


Buradaki "ana hat" cevabımın yüksek oy aldığından çok memnun oldum. Ancak, aşağıdaki @chaos'un cevabı neden aşağı oy aldı? (Bu tahtaya yeni gelen biri olarak, bu yorumu sadece kendi cevabımın cevabına göre gönderemem.) İkinci önerisi bir kabuk komut dosyası çözümü için doğrudur ve harici bir findkomut çalıştırmanın yükünü önler .
JonBrave

İkincisi gerçekten doğrudur. Dizin adları boşluk veya özel karakterler (örneğin ters eğik çizgiler) içeriyorsa, ilkinde başarısız olur. Güvenli sürüm için cevabında yaptığım düzenlemeye bakın.
terdon

Katılıyorum. Bu onun övdüđüm ikinci, sadece mermi cevabı.
JonBrave

Biliyorum, sadece iniş çıkışını açıklıyordum (ki ben yapmadım).
terdon


1

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
' {} {} \;

0

Çözümü aldım. Aşağıdaki find komutu gereksinimlerimi karşılıyor.

find . -maxdepth 1 -type d \( ! -name . \) -exec bash -c "cd '{}' && ls -l |awk '{ print $9 }' |grep `date +"%m%d%Y"`|xargs echo" \;

0

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.


1
(1)  standart çıktı bir boru olduğunda varsayılan olarak 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.
Scott

İyi makas Scott. Cevabı açık bir şekilde isimlendirilmiş dirs içermeyen birçok sistem için, tek seferler için hala yararlı olabileceğini düşünüyorum.
JGurtz
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.