file01.txt、file02.txt…file85.txtなどのファイル範囲を「rm」または「mv」する方法


23

このような名前のファイルがたくさんあるとします:

file01.txt file02.txt file03.txt ... file20.txt

これらのファイルの範囲でコマンドを実行したいと思います。

「file05.txt」から「file09.txt」に「rm」したい場合は知っています:

rm file0[5-9].txt

しかし、file08.txtからfile13.txtまでの範囲を「rm」するにはどうすればよいですか?私はこのコードを試しました

rm file[08-13].txt

そしてそれは動作しません。このコマンドを実行できます:

rm file0[89].txt file1[0-3].txt

しかし、可能であれば、「rm」に対するもう1つの洗練された引数でこれを行うことができるかどうかを知りたいです。


ほとんど同じ質問がここで回答されました: stackoverflow.com/questions/25049411/…–
arielf

回答:


38

次のブレース展開を使用する必要がありますbash

rm file{08..13}.txt

これにより、ファイルが削除さfile08file13、欠落しているファイルがある場合はエラーメッセージが表示されます。

ニーズに合わせて範囲を設定します。


グロビング演算子の問題は、[]内部の各文字/数字を単一のトークンとして扱うため、単一の数字を使用した範囲宣言のみがサポートされることです。

を使用することを主張する場合[]、このかなりratherいパターンを使用して以下に一致さfile08せることができますfile13

rm file0[8-9].txt file1[0-3].txt

5
for mv foo.{txt,md}またはcp foo.txt{,.bak}
Kos

2

そのようなUbuntuのデフォルトのようないくつかのシェル、/bin/sh(であるdash)、または mkshブレース展開を持たない、またはの場合ksh-ブレース展開パッド入りのゼロを使用することはできません。

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

そのような場合、printfファイル名の数字部分をフォーマットするために利用でき、whileループを使用してcのようなforループ動作を実装できます(置換echoするrmか、任意のものに注意してください):

$ 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

そして、これはかなりのポータブルである-と連携しdashkshmkshまた、bash。以下の場合kshbash我々はまた、使用することができますc-style for loop syntax (but not in case ofmksh or)dash`を:

$ 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

注意していることbashの場合、printf支持体は、変数に印刷するため、私たちは何ができるprintf -v num "%.2d" "$i"代わりに、コマンド置換を使用します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.