Grepは、日付と時刻を含むファイルをファイル名として選択します。

Grepは、日付と時刻を含むファイルをファイル名として選択します。

/home/download/fileLinuxには次のファイルがあります。

Abc_05-29-2022_12:30:01
Abc_05-29-2022_12:40:01
Abc_05-29-2022_12:50:02
Abc_05-29-2022_12:45:01
Abc_05-29-2022_12:35:01
Abc_05-30-2022_12:30:01
Abc_05-30-2022_12:35:01
Abc_05-30-2022_12:40:01
Abc_05-30-2022_12:20:01
Abc_05-30-2022_12:50:01

bashスクリプトを使用して選択したファイルをgrepし、そのファイルを別の場所にコピーしたいと思います。

  • ソースパス:/home/Download/files
  • 宛先: /home/test

abc_29-05-22_12:40:0[1-2]たとえば、からのファイルをgrepしたいと思いますabc_30-05-22_12:20:0[1-2]。シェルスクリプトを使用して、このファイルを別のパスにコピーします。

ベストアンサー1

このようなツールはgrep、数値制約(日付)に基づいてファイルを選択するのには適していません。正規表現は急速に複雑になり、メンテナンスが困難になる可能性があります。数値比較が可能な場合は、grep以外のスクリプト言語が必要です。この場合、変更日は表示されますが、名前に基づいてファイルを選択するのが難しいので、find正しいツールではありません。

また、お客様の質問に日付形式が一部一致しません。はい、またはday/month/year()?29-05-22_12:40month-day-year05-29-2022

-また、日付コマンドは通常、スラッシュ()の代わりにダッシュ()を使用する形式を認識しません。/

したがって、いくつかの調整では、このスクリプトは要件を満たす必要があります。

#!/bin/bash --

dirsource="/home/Download/files"
dirdestin="/home/test"

filestart="$( date -ud '2022/05/29 12:40' +'%s' )"
fileend="$(   date -ud '2022/05/30 12:20' +'%s' )"

while IFS="" read line; do
    IFS="_-" read name month day year time <<<"$line"
    filenow="$(date -ud "$year/$month/$day $time" +"%s")"
    if [[ $filenow -ge $filestart ]] && [[ $filenow -le $fileend ]]; then
        echo \
        mv "$dirsource/$line" "$dirdestin/$line"
    fi
done <./infile

echo \必要に応じて動作すると確信している場合は、実際にコマンドを実行している行を削除してください。

おすすめ記事