ファイル名の形式がのfile.00064.name.99999.end
場合、最初に番号以外をすべて削除する必要があります。for
これにはループを使用します。
また、Bash算術は0で始まる数字を基数8として扱うため、基数10を使用するようにBashシェルに指示する必要があります。
スクリプトとして、ファイルを含むディレクトリで起動するには、次を使用します。
#!/bin/bash
for f in ./*
do
if [[ -f "$f" ]]; then
file="${f%.*}"
if [[ $((10#${file##*.} % 12)) -ne 0 ]]; then
rm "$f"
fi
else
echo "$f is not a file, skipping."
fi
done
または、この非常に長いいコマンドを使用して同じことを行うことができます。
for f in ./* ; do if [[ -f "$f" ]]; then file="${f%.*}"; if [[ $((10#${file##*.} % 12)) -ne 0 ]]; then rm "$f"; fi; else echo "$f is not a file, skipping."; fi; done
すべての部分を説明するには:
for f in ./*
は、現在のディレクトリ内のすべてのものを意味します、do ....これにより、見つかった各ファイルまたはディレクトリが変数$ fとして設定されます。
if [[ -f "$f" ]]
見つかったアイテムがファイルかどうかをチェックします。そうでない場合は、そのecho "$f is not...
部分にスキップします。これは、誤ってディレクトリを削除し始めないことを意味します。
file="${f%.*}"
$ file変数を、最後の後に来るファイル名を切り取るファイル名として設定します .
。
if [[ $((10#${file##*.} % 12)) -eq 0 ]]
は、メインの算術演算が開始される場所です。拡張子なしで、ファイル名${file##*.}
の最後の前のすべてをトリミングします.
。$(( $num % $num2 ))
は、モジュロ演算を使用するBash算術の構文です。10#
最初は、Bashに基数10を使用してこれらの厄介な先行0を処理するように指示します。$((10#${file##*.} % 12))
次に、ファイル名番号の残りを12で割った残りを残し-ne 0
ます。残りがゼロに等しくないかどうかをチェックします。
- 剰余が0以外の場合、ファイルは
rm
コマンドで削除されます。これを最初に実行rm
するecho
ときに置き換えて、削除する予定のファイルを取得することを確認できます。
このソリューションは非再帰的です。つまり、現在のディレクトリ内のファイルのみを処理し、サブディレクトリには一切入りません。
if
声明echo
ディレクトリについて警告するコマンドとして本当に必要はありませんrm
、それが所有していますのは、そう、ディレクトリに文句を言うと、それらを削除しません。
#!/bin/bash
for f in ./*
do
file="${f%.*}"
if [[ $((10#${file##*.} % 12)) -ne 0 ]]; then
rm "$f"
fi
done
または
for f in ./* ; do file="${f%.*}"; if [[ $((10#${file##*.} % 12)) -ne 0 ]]; then rm "$f"; fi; done
正しく動作します。