指定された範囲内の番号付きファイルを削除するにはどうすればよいですか?

指定された範囲内の番号付きファイルを削除するにはどうすればよいですか?

folderAには、 で始まる番号シーケンスを持つファイルがいくつかありますa_000000。 特定の番号から始まるファイル、つまりa_000750この のファイルの最後までを削除したいとしますfolderA。 シェル スクリプトを使用してこれを行う方法を教えていただけませんか?

答え1

範囲の終わりを知っているか推測できると仮定すると、次のように使用できます。ブレース拡張:

rm a_{000750..000850}

上記は、a_000750 から a_000850 までの間の 101 個のファイルを削除します (存在しないファイルを参照するファイル名については警告します)。ファイルが多すぎて削除できない場合は、次を使用しますfind

find . -name 'a_*' | while read -r file; do 
  [ "${file#./a_}" -gt 000749 ] && rm -v "$file" 
done

ここで、 はfindに一致するすべてのファイルを単純にリストしますa_*。リストはwhileループに渡され、各ファイル名が変数 に読み込まれます$file。次に、bash の文字列操作機能では、数値部分 (find はファイルを として印刷する./fileため、${file#./a_}数値のみを印刷します) が000750以上の場合、ファイルは削除されます。 は、-v削除されたファイルを確認できるようにするために存在します。

上記は適切なファイル名を前提としていることに注意してください。ファイル名にスペース、改行、その他の奇妙な文字が含まれる可能性がある場合は、代わりに以下を使用してください。

find . -name 'a_*' -print0 | while IFS= read -rd '' file; do 
  [ "${file#./a_}" -gt 000749 ] && rm -v "$file" 
done

答え2

次のようなことができます:

find . -regextype posix-extended -iregex './a_[0-9]{6}' -execdir bash -c '[[ ${1##./a_} > 000750 ]] && echo $1' "removing: " {} \;

または:

find . -regextype posix-extended -iregex './a_[0-9]{6}' | sort | sed '0,/000750/d' | xargs echo

最初の方法は、固定プレフィックスを想定し、それを削除して値をチェックします。

2 番目の方法は、固定長の接尾辞 (および共通の固定接頭辞) を想定し、その事実に依存します。つまり、 は辞書式に201の前に来ますが31、 の前には来ないということです031

コマンドでこれをテストしecho、正しいファイルがリストされていることを確認したら、rm代わりに を使用します。

答え3

Bash では以下を実行できます:

for i in {1001..3000} ; do rm file_"$i".dat ; done

答え4

単純な

rm partialfilename* -f

あなたの例では

rm a_00075* -f

関連情報