コンテンツに応じてファイルを移動する

コンテンツに応じてファイルを移動する

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 ... ]ディレクトリ内の非正規ファイル(または一般ファイルへのシンボリックリンク)であるすべてのエントリをスキップします。

関連情報