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