Misalkan saya memiliki banyak file dengan nama ini:
file01.txt file02.txt file03.txt ... file20.txt
dan saya ingin menjalankan perintah pada berbagai file ini.
Saya tahu jika ingin 'rm' dari 'file05.txt' ke 'file09.txt' Saya bisa melakukannya:
rm file0[5-9].txt
tetapi bagaimana saya bisa 'berkisar' dari file08.txt ke file13.txt? Saya mencoba kode ini
rm file[08-13].txt
dan itu tidak berhasil. Saya bisa menjalankan perintah ini:
rm file0[89].txt file1[0-3].txt
tapi saya ingin tahu apakah saya bisa melakukan ini dengan hanya satu argumen lagi untuk 'rm' jika memungkinkan.
Jawaban:
Anda harus menggunakan ekspansi brace dari
bash
:Ini akan menghapus file
file08
kefile13
, akan menampilkan pesan kesalahan jika file yang hilang.Tetapkan rentang untuk memenuhi kebutuhan Anda.
Masalah dengan operator globbing
[]
adalah bahwa ia memperlakukan setiap karakter / digit di dalamnya sebagai token tunggal dan karenanya hanya mendukung deklarasi jangkauan menggunakan digit tunggal.Jika Anda bersikeras menggunakan
[]
, Anda dapat menggunakan pola yang agak jelek ini untuk dicocokkanfile08
denganfile13
:sumber
mv foo.{txt,md}
ataucp foo.txt{,.bak}
Beberapa shell, seperti default Ubuntu
/bin/sh
(yangdash
) ataumksh
tidak memiliki ekspansi brace, atau dalam kasusksh
- ekspansi brace tidak dapat menggunakan nol nol:Dalam kasus seperti itu, kita dapat menggunakan
printf
untuk memformat bagian nomor nama file, dan menggunakan loop sementara untuk menerapkan c-like untuk perilaku loop (catatan untuk menggantiecho
denganrm
atau apa pun yang Anda inginkan):Dan ini cukup portabel - bekerja dengan
dash
,ksh
,mksh
, jugabash
. Dalam kasusksh
danbash
kita juga dapat menggunakanc-style for loop syntax (but not in case of
mkshor
dash`):Perhatikan bahwa dalam
bash
kasus ini,printf
mendukung pencetakan ke variabel, dan dengan demikian kita bisa melakukanprintf -v num "%.2d" "$i"
alih - alih menggunakan substitusi perintah.sumber