Saya punya folder dengan banyak file (xyz1, xyz2, hingga xyz5025) dan saya perlu menjalankan skrip pada setiap file, mendapatkan xyz1.faa, xyz2.faa, dan seterusnya sebagai output.
Perintah untuk satu file adalah:
./transeq xyz1 xyz1.faa -table 11
Apakah ada cara untuk melakukan itu secara otomatis? Mungkin kombo yang harus dikerjakan?
for file in xyz*; do ./transeq "$file" "${file}.faa" -table 11; done
. Saya mengetik hal semacam ini sepanjang waktu. Dan jika Anda ingin memverifikasi bahwa nama file, dll. Diperluas dengan cara yang Anda inginkan, cukup beriecho
hak setelahdo
yang pertama kali, lalu kembali ke riwayat shell Anda dan hapus itu untuk yang kedua kalinya."$file".faa
sedikit lebih mudah diketik sebagai bagian dari one-liner interaktif, dan aman karena.faa
tidak mengandung karakter meta shell yang perlu dikutip.xyz*
glob akan mengambil file .faa juga. Untuk bash, jalankanshopt -s extglob
( referensi ), lalu gunakanfor file in xyz!(*.faa) ...
untuk mengecualikan file .faa agar tidak dikirim melalui loop.Jika Anda menginstal GNU Parallel Anda dapat melakukannya secara paralel seperti ini:
Jika program Anda menggunakan CPU intensif, kecepatannya harus sedikit.
sumber
Anda dapat melakukan sesuatu seperti ini di
bash
baris perintah:Kami membuat bilangan bulat dari 1 hingga 5025, satu / baris, kemudian mengumpankannya satu per satu ke xargs, yang merangkum bilangan bulat ke dalam
{}
dan kemudian mentransplantasikannya ke dalam baris perintah ./transeq dengan cara yang sesuai.Jika Anda tidak memiliki fasilitas brace-ekspansi
{n..m}
maka Anda dapat memintaseq
utilitas untuk menghasilkan angka-angka itu.Atau, Anda selalu dapat meniru generasi numerik melalui:
sumber
for i in {1..5025}; do ./transeq "xyz$i" "xyz$i".faa -table 11; done
adalah cara yang lebih mudah untuk dipikirkan dan diketik. Jika Anda ingin mencetak perintah sebelum menjalankannya, gunakanset -x
.for i in
{1..5025}
untuk mencapai hasil yang persis sama dengan milik Anda. Anda juga bisa menulisfor ((i=1 ; i<=5025 ; i++)); do ./transeq "xyz$i" "xyz$i".faa -table 11; done
dalam bash, tetapi saya biasanya menggunakan{a..b}
sintaks rentang karena lebih cepat untuk mengetik.Menggunakan find, berguna ketika file Anda tersebar di dalam direktori
sumber
Dengan anggapan Anda memiliki lebih dari satu inti, dan setiap doa dapat berjalan secara independen dari yang lain, Anda akan memperoleh kecepatan yang cukup dengan gerakan paralel.
Cara yang relatif sederhana untuk melakukan ini adalah melalui
-P
parameterxargs
- misalnya, jika Anda memiliki 4 core:Yang
-n 1
memberitahuxargs
untuk memilih hanya satu argumen dari daftar untuk setiap doa (secara default itu akan melewati banyak) , dan yang-P 4
memberitahu untuk menelurkan 4 proses pada saat yang sama - ketika satu mati, yang baru melahirkan.IMHO, Anda tidak perlu menginstal paralel GNU untuk kasus sederhana ini -
xargs
sudah cukup.sumber
Kamu bisa memakai
xarg
ls | xargs -L 1 -d '\n' your-desired-command
-L 1
menyebabkan lulus 1 item sekaligus-d '\n'
membuat outputls
dibagi berdasarkan baris baru.sumber