Saya mencoba untuk menulis skrip yang akan dijalankan di direktori yang diberikan dengan banyak sub direktori tingkat tunggal. Script akan melakukan cd ke masing-masing sub direktori, menjalankan perintah pada file dalam direktori, dan keluar untuk melanjutkan ke direktori berikutnya. Apa cara terbaik untuk melakukan ini?
shell-script
Sesuatu Jones
sumber
sumber
youtube-dl
.Jawaban:
sumber
for d in ./*/
memulai loop yang menyimpan setiap item dalam./*/
(daftar file / folder, dalam hal ini) dalam sebuah variabel$d
.do (cd "$d" && somecommand);
memulai badan loop. Di dalam tubuh, itu mulai subkulit dan menjalankancd
dansomecommand
perintah. Karena ini adalah shell anak, shell induk (shell dari mana Anda menjalankan perintah ini) mempertahankan CWD dan variabel lingkungan lainnya.done
cukup menutup tubuh loop.for d in ./*/ ; do (cd "$d" && ls); done
tidak akan berfungsi. tapi,for d in ./*/ ; do (cd "$d" && for d in ./*/ ; do (cd "$d" && ls); done ); done
akan berhasil. -menggunakan ls sebagai perintah dalam contoh ini.-bash: cd: ./*/: No such file or directory
Cara terbaik adalah tidak menggunakan
cd
sama sekali:execdir
sepertiexec
, tetapi direktori kerja berbeda:Ini bukan POSIX.
sumber
find
jalankan perintah-perintah itu, jadi tidak akan tahu alias. Apakahmd
dan apakah.link
direktori itu?bash
:find . -type f -iname '*.link' -execdir ${BASH_ALIASES[md]} -i {} \;
Anda tidak perlu melakukancat
denganwget
, yang memiliki-i
bendera untuk membaca di sebuah URL dari file. Ini juga agak berbeda dari pertanyaan awal Anda (karena Anda tampaknya tertarik hanya pada file yang diberi nama.link
dan bukan file lain yang mungkin ada).Perintah di atas tidak perlu melakukan subshell - hanya melacak kemajuannya di shell saat ini dengan bergantian
$OLDPWD
dan$PWD
. Ketika Andacd -
shell bertukar nilai dari dua variabel ini, pada dasarnya, karena perubahan direktori. Ia juga mencetak nama untuk setiap direktori karena berfungsi di sana untuk stderr.Saya baru saja melihatnya dan memutuskan untuk melakukan pekerjaan yang lebih baik dengan penanganan kesalahan. Ini akan melewati sebuah dir ke mana ia tidak bisa
cd
- dancd
akan mencetak pesan tentang mengapa harus stderr - dan itu akanbreak
w / kode keluar tidak nol jika Andacommand
tidak berhasil menjalankan atau jikacommand
entah bagaimana menjalankan mempengaruhi kemampuannya untuk kembali ke direktori asli Anda -$OLDPWD
. Dalam hal ini ia juga melakukan yangcd -
terakhir - dan menulis nama direktori kerja saat ini yang dihasilkan ke stderr.sumber
sumber