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 \必要に応じて動作すると確信している場合は、実際にコマンドを実行している行を削除してください。

答え2

Abc_mm-dd-yyyy_HH:MM:SSbashの代わりにzsh globを使用して2022-05-29T12:40:01から2022-05-30T12:20:02(形式がある場合)までの日付を表す名前のファイルをコピーするには、次のようにします。

set -o extendedglob
cp /home/download/file/*(e['
  [[ $REPLY:t = (#b)Abc_(<1-12>-<1-31>)-(<->)_(<0-23>:<0-59>:<0-59>) &&
     ${t::=$match[2]-$match[1]T$match[2]} >= 2022-05-29T12:40:01 &&
     $t <= 2022-05-30T12:20:02 ]]']) /home/test/

私たちはyyyy-mm-ddTHH:MM:SSこれらのタイムスタンプを語彙的に比較できる標準形式に再配置します。

次のヘルパー関数をチェックインすることもできます。

range() {
  set -o localoptions -o extendedglob
  local match t
  [[ $REPLY:t = (#b)*_(<1-12>-<1-31>)-(<->)_(<0-23>:<0-59>:<0-59>) &&
     ${t::=$match[2]-$match[1]T$match[2]} >= $1 && $t <= $2 ]]
}

それから:

cp /home/download/file/Abc*(e['range 2022-05-29T12:40:01 2022-05-30T12:20:02'])

関連情報