Saya ingin skrip shell saya mengunjungi semua subdirektori dalam direktori utama. Lakukan sesuatu di direktori, mengirim output ke file spool dan pindah ke direktori berikutnya. Pertimbangkan Main Dir = / tmp Sub Dir = ABCD (Empat sub direktori)
Saya ingin skrip shell saya mengunjungi semua subdirektori dalam direktori utama. Lakukan sesuatu di direktori, mengirim output ke file spool dan pindah ke direktori berikutnya. Pertimbangkan Main Dir = / tmp Sub Dir = ABCD (Empat sub direktori)
Jawaban:
Gunakan satu for
lingkaran:
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
Itu hanya mencari subdirektori dari direktori /path/to/dir
. Perhatikan bahwa contoh sederhana di atas akan gagal jika nama direktori berisi spasi putih atau karakter khusus. Pendekatan yang lebih aman adalah:
find /tmp -maxdepth 1 -type d -print0 |
while IFS= read -rd '' dir; do echo "$dir"; done
Atau di dataran bash
:
for d in /path/to/dir/*; do
if [ -d "$d" ]; then
echo "$d"
fi
done
(perhatikan bahwa bertentangan dengan find
itu orang juga menganggap symlink ke direktori dan mengecualikan yang tersembunyi)
find
seperti itu.
date +"%m%d20%Y"
| xargs echo echo $ d
date +"%m%d20%Y"
| xargs echo echo $ d Hasil yang diharapkan adalah ls -ltr dari semua subdirektori . Di atas lingkaran tidak berfungsi
Saya seorang bash
pemula yang lengkap , tetapi seorang veteran PBB * X. Meskipun tidak diragukan lagi ini dapat dilakukan dalam skrip Bash shell, di masa lalu kami terbiasa find [-maxdepth <levels>] <start-dir> -exec <command> ;
untuk mencapai ini. Anda dapat melakukan man find
dan bermain-main, mungkin sampai seseorang memberitahu Anda bagaimana melakukannya bash
!
find
perintah eksternal .
$(find...)
hal yang praktek yang buruk .
Sepertinya Anda menginginkan nama file di bawah masing-masing subdir; yang ls -l | awk
tidak cukup kuat, untuk apa jika mereka nama file terdiri spasi dan / atau baris baru? Di bawah ini find
akan berfungsi bahkan untuk mereka find
yang tidak memiliki kesempatan -maxdepth
untuk mereka:
find . ! -name . -type d -prune -exec sh -c '
cd "$1" && \
find "." ! -name . -prune -type f
' {} {} \;
Mungkin juga menggunakan ls, grep, dan tr
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 juga dapat digunakan sebagai pemilih jika ls Anda tidak memiliki opsi di atas
du --max-depth=1 | sed -e 's/^.*\.\///' | grep -v '\.$'
Mungkin penting untuk mencatat contoh-contoh ini mengembalikan direktori tersembunyi dan mengecualikan direktori induk dan saat ini
ls
tulis satu file per baris (apa yang -1
ditentukan opsi) secara default ketika output standar adalah pipa (jadi itu berlebihan dalam jawaban Anda). (2) Mengurai output ls
adalah ide yang buruk - lihat ini dan ini . Jawaban pertama Anda akan gagal jika direktori memiliki spasi (atau baris baru) dalam nama mereka, dan semua akan gagal jika mereka memiliki baris baru dalam nama mereka. (3) Anda harus selalu mengutip variabel shell (misalnya, "$dir"
) kecuali Anda memiliki alasan kuat untuk tidak melakukannya, dan Anda yakin tahu apa yang Anda lakukan.