Cara 'rm' atau 'mv' berbagai file seperti file01.txt, file02.txt ... file85.txt

23

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.


sumber
Sebuah pertanyaan yang hampir identik dijawab di sini: stackoverflow.com/questions/25049411/...
arielf

Jawaban:

38

Anda harus menggunakan ekspansi brace dari bash:

rm file{08..13}.txt

Ini akan menghapus file file08ke file13, 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 dicocokkan file08dengan file13:

rm file0[8-9].txt file1[0-3].txt
heemayl
sumber
5
ekspansi brace juga berguna dengan koma, seperti untuk mv foo.{txt,md}ataucp foo.txt{,.bak}
Kos
2

Beberapa shell, seperti default Ubuntu /bin/sh(yang dash) atau mkshtidak memiliki ekspansi brace, atau dalam kasus ksh- ekspansi brace tidak dapat menggunakan nol nol:

$ ksh -c 'echo {05..13}'
5 6 7 8 9 10 11 12 13

Dalam kasus seperti itu, kita dapat menggunakan printfuntuk memformat bagian nomor nama file, dan menggunakan loop sementara untuk menerapkan c-like untuk perilaku loop (catatan untuk mengganti echodengan rmatau apa pun yang Anda inginkan):

$ i=5; while [ "$i" -le 10 ]; do num=$(printf "%.2d" "$i" ); echo "file$num.txt";i=$(($i+1)); done
file05.txt
file06.txt
file07.txt
file08.txt
file09.txt
file10.txt

Dan ini cukup portabel - bekerja dengan dash, ksh, mksh, juga bash. Dalam kasus kshdan bashkita juga dapat menggunakan c-style for loop syntax (but not in case ofmksh ordash`):

$ ksh -c 'for((i=5;i<11;i++)); do num=$(printf "%.2d" "$i" ); echo "file$num.txt";done'             
file05.txt
file06.txt
file07.txt
file08.txt
file09.txt
file10.txt

Perhatikan bahwa dalam bashkasus ini, printfmendukung pencetakan ke variabel, dan dengan demikian kita bisa melakukan printf -v num "%.2d" "$i"alih - alih menggunakan substitusi perintah.

Sergiy Kolodyazhnyy
sumber