25より大きい数字を含むが(少なくとも1つのインスタンスでは)、文字列の後に25未満の数字を含まないすべてのファイルを移動したいと思います。 >乱数_xxx_を特定のフォルダに移動します。
移動する必要があるファイルの例:
>23424_xxx_26
>331134_xxx_27
>6634_xxx_30
移動する必要のないファイルの例:
>22234_xxx_20
>434534_xxx_27
答え1
したがって、最初の問題は、移動する必要があるファイルを検索することです。
これは以下を使用して行うことができますgrep
。
grep -q -E '^>.*_(1?[0-9]|2[0-4])$'
grep -q -E '^>.*_(2[5-9]|[3-9][0-9]|[0-9]{3,})$'
入力データに指定された拡張正規表現に一致する行が含まれている場合、これらのコマンドはtrueを返します。
この式は、_(1?[0-9]|2[0-4])$
下線の後の行の末尾に現れる25未満の正の整数と一致し、下線の後の行の末尾に現れる25以上の正の整数と一致し_(2[5-9]|[3-9][0-9]|[0-9]{3,})$
ます(ゼロがないと仮定)。 -パディングされた整数(例002
:)。>
行の先頭でも一致します。このオプションは-q
実際に停止します。grep
出力何でも可能です(行の1つが見つかるかどうかに興味があります)。
ファイルをコピーするには、最初のファイルをgrep
返す必要があります。間違った2番目はgrep
戻らなければなりません本物。
これをディレクトリ内のすべてのファイルに適用します(この場合はファイルについて何も言わなかったため、ファイル名に関係なく)。
for filename in ./*; do
[ ! -f "$filename" ] && continue
if ! grep -q -E '^>.*_(1?[0-9]|2[0-4])$' "$filename" &&
grep -q -E '^>.*_(2[5-9]|[3-9][0-9]|[0-9]{3,})$' "$filename"
then
mv -i "$filename" /some/destination
fi
done
これにより、要件を満たすファイルがターゲットディレクトリに移動されます/some/destination
。この-i
オプションを使用するmv
と、移動中のファイルと同じ名前の既存のファイルを上書きする前に、ユーティリティに確認を要求します。
ループの最初のテストは、[ ! -f ... ]
ディレクトリ内の非正規ファイル(または一般ファイルへのシンボリックリンク)であるすべてのエントリをスキップします。