Katakanlah saya sedang dalam direktori yang memiliki beberapa subdirektori, dir1
, dir2
, dan dir3
. Masing-masing direktori memiliki file foo
dan saya ingin menjalankan perintah yang sama pada masing foo
-masing direktori dan memiliki perintah yang dieksekusi dari dalam direktori itu.
Jika saya melakukannya "dengan tangan", itu akan terlihat seperti ini:
cd dir1
(execute on foo)
cd ../dir2
(execute on foo)
cd ../dir3
(execute on foo)
Sangat penting bahwa perintah dijalankan dari masing-masing direktori . foo
adalah skrip penjadwalan batch (untuk HTCondor, jika Anda ingin tahu) dan harus dijalankan dari setiap subdirektori sehingga output dari proses yang dimulai oleh skrip penjadwalan akan berakhir di setiap subdirektori.
Pertanyaan " Temukan file dan jalankan perintah di direktori file ", sejauh yang saya tahu, tidak menjawab pertanyaan saya. Jawaban pertama untuk pertanyaan itu lebih merupakan solusi yang tidak akan berfungsi dalam kasus saya, dan jawaban kedua tidak memiliki cukup penjelasan bagi saya untuk mengetahui cara menggunakannya.
Jawaban:
Dengan asumsi Anda
find
mendukungnya, gunakan-execdir
opsi sebagai ganti-exec
Jika tidak, berikan detail platform dan / atau distribusi Anda (sebagaimana diperlukan).
sumber
{}
, tetapi orang tua dari{}
.-exec
, tetapi perintah yang ditentukan dijalankan dari subdirektori yang berisi file yang cocok ".Dengan asumsi Anda tahu persis direktori apa yang menjalankan perintah Anda,
atau, mengulangi
foo
file,Subshell mencegah
cd
untuk mempengaruhi direktori kerja dari sisa skrip. The${foo%/*}
substitusi parameter mengembang dengan nama direktori dimanafoo
file yang hidup (dengan menghapus semuanya setelah yang terakhir/
dalam nilai$foo
).Menggunakan standar
find
untuk melakukan hal yang sama (dalam kasus di manafoo
file dapat hidup jauh di dalam struktur direktori):Dengan kata lain: Temukan semua file biasa yang disebut "foo" di mana saja di direktori saat ini atau di bawah dan berikan nama path mereka ke skrip shell ini dalam batch. Script shell akan mengulangi nama path yang diberikan, mengubah direktori ke bagian direktori dari setiap pathname dan jika itu berhasil, jalankan
somecommand foo
.Untuk solusi yang menggunakan yang tidak standar
-execdir
, lihat jawaban roaima . Jawabannya disesuaikan dengan contoh saya:sumber