Saya memiliki satu set file dalam direktori bernomor sebagai berikut:
file1.txt
file2.txt
...
file30.txt
...
Sekarang, saya ingin menjalankan perintah pada rentang file tertentu, katakanlah 18 hingga 31.
Sejauh ini saya telah menggunakan cara-cara berikut,
tiga argumen
command file1[8-9].txt file2[0-9].txt file3[0-1].txt
Sekarang anggaplah saya ingin setiap nomor lainnya,
lingkaran
for i in `jot - 18 31 2`; do echo file${i}.txt; done | xargs command
sepertinya ini adalah loop yang lebih andal (spasi bekerja)
for i in `jot - 18 31 2`; do echo "\"file${i}.txt\" "; done | xargs command
tetapi sepertinya harus ada cara yang lebih sederhana untuk melakukan ini. Saya menduga solusi terbaik adalah membuat fungsi bash yang akan mengembalikan set file ke baris perintah. Maka saya bisa melakukan sesuatu seperti,
command `filerange file 18 31`
Adakah cara atau saran yang lebih baik untuk melakukan ini secara efisien?
Saya minta maaf sebelumnya jika saya melewatkan pertanyaan yang sama ini dijawab di tempat lain di web atau di superuser
.
for
loop yang memungkinkan ruang dalam nama file menggunakan xargs. Tampaknya berfungsi jika Anda tidak memiliki bash 4. Jika Anda memiliki bash 4, maka pasti gunakan ekspansi brace! Lihat jawaban yang dipilih. Plug Shameless untuk memperbarui pesta Snow LeopardJawaban:
Coba ini:
Ini dikenal sebagai "ekspresi urutan" dan merupakan bagian dari fitur ekspansi brace Bash . Ini bekerja di Bash 3 dan 4.
Fitur kenaikan baru untuk Bash 4. Anda mungkin memiliki Bash 3.x.
Di Bash 4, Anda dapat melakukan:
Namun di Bash 3, Anda harus melakukan ini untuk mendapatkan hasil yang sama:
Bentuk yang sama bertambah satu:
Setiap angka dapat berupa variabel atau ekspresi. Namun, dalam ekspresi berurutan angka harus berupa konstanta
Berikut adalah contoh menggunakan formulir itu di file Anda:
Fitur baru lain dari ekspresi urutan dalam Bash 4 adalah kemampuan untuk memasukkan nol di depan. Ini berguna jika Anda ingin membuat (dan menggunakan) file bernomor yang dapat diurutkan dengan benar.
Dalam Bash 4:
akan membuat file bernama "file001.txt" melalui "file010.txt". Nama mereka akan disortir dalam urutan yang diharapkan. Tanpa nol di depan, "file10.txt" akan mengurutkan sebelum "file1.txt".
Untuk bekerja dengan file, Anda dapat menggunakan sintaks nol di depan yang sama:
Di Bash 3, jika Anda membutuhkan nol di depan, Anda harus memberi nilai sendiri:
The
printf
pernyataan akan tambahkan nilai i dengan nol terkemuka sehingga lebar adalah 3, misalnya ( "4" menjadi "004").Edit:
Mengakomodasi ruang dalam nama file secara langsung:
sumber
{1..10..2}
bekerja di bash OSX saya.{01..10}
adalah baru untuk Bash 4. Anda mungkin memiliki Bash 3.x. Jika Anda membutuhkan fitur kenaikan atau untuk menggunakan variabel untuk batas rentang, maka gunakan formulir ini:for ((i=1; i<=10; i+=2}
(ataui++
untuk menambah satu). Setiap angka dapat berupa variabel atau ekspresi. Kemudian, untuk menggunakan nilai di dalamfor
loop:echo "file${i}.txt". In Bash 3, if you need leading zeros, inside the for loop do:
printf -vi '% 03d' $ i` yang akan menambahkan nilaii
dengan memimpin nol sehingga lebarnya adalah 3, misalnya ("4" menjadi "004").