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)
bash
shell-script
Ashish
sumber
sumber
Jawaban:
Gunakan satu
for
lingkaran: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:Atau di dataran
bash
:(perhatikan bahwa bertentangan dengan
find
itu orang juga menganggap symlink ke direktori dan mengecualikan yang tersembunyi)sumber
find
seperti itu.date +"%m%d20%Y"
| xargs echo echo $ ddate +"%m%d20%Y"
| xargs echo echo $ d Hasil yang diharapkan adalah ls -ltr dari semua subdirektori . Di atas lingkaran tidak berfungsiSaya 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 terbiasafind [-maxdepth <levels>] <start-dir> -exec <command> ;
untuk mencapai ini. Anda dapat melakukanman find
dan bermain-main, mungkin sampai seseorang memberitahu Anda bagaimana melakukannyabash
!sumber
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 inifind
akan berfungsi bahkan untuk merekafind
yang tidak memiliki kesempatan-maxdepth
untuk mereka:sumber
Saya mendapat solusinya. Perintah find di bawah ini memenuhi persyaratan saya.
sumber
Mungkin juga menggunakan ls, grep, dan tr
du / sed juga dapat digunakan sebagai pemilih jika ls Anda tidak memiliki opsi di atas
Mungkin penting untuk mencatat contoh-contoh ini mengembalikan direktori tersembunyi dan mengecualikan direktori induk dan saat ini
sumber
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 outputls
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.