이름에 포함된 날짜를 기준으로 파일 찾기

이름에 포함된 날짜를 기준으로 파일 찾기

아래 스크립트에서는 사용자에게 날짜 범위를 입력하고 해당 범위를 적용하여 명령 결과를 필터링하도록 요청합니다 find. 이 명령은 이름에 날짜가 포함된 로그 파일에 대해 작동합니다. 예를 들어 filename-YYYYMMDD.gz해당 파일이 식별되면 새 디렉터리에 복사됩니다.

지금까지 제가 알고 있는 것(날짜 범위 등)은 -newermt 20190820 ! -newermt 2019082625일이나 26일에 파일을 복사하지 않습니다.

고쳐 쓰다:

#!/bin/bash




#Take input from user

read -p "Enter year (YYYY): " Y
read -p "Enter start month: " SM
read -p "Enter start day: " SD
read -p "Enter end month: " EM
read -p "Enter end day: " ED
read -p "Enter copy destination directory (with absolute path): " new_directory

# pad month and day numbers with zero to make the string 2 character long
SD="$(printf '%02d' $SD)"
SM="$(printf '%02d' $SM)"
ED="$(printf '%02d' $ED)"
EM="$(printf '%02d' $EM)"

# Make sure that the new directory exists
#mkdir -p new_directory

# Place the result of your filtered `find` in an array,
# but, before, make sure you set:
#IFS='\n'  # in case some file name stored in the array contains a space

array=(
        $(find /directory/log/ -name "test.file-*.gz" -execdir bash -c '
            filedate="$(basename ${0#./test.file-} .gz)";
            if [[ $filedate -gt $Y$SM$SD ]] && [[ $filedate -lt $Y$EM$ED ]]; then
                basename $0
            fi' {} \;
         )
      )

# loop over array, to copy selected files to destination directory

for i in "${array[@]}"; do
    # ensure that destination directory has full path
    cp "$i" "$new_directory"
done

find -newermt 명령은 파일 이름이 아닌 특정 날짜에 수정된 파일을 찾는다는 것을 알고 있습니다. 더 좋은 방법을 아시면 정말 감사하겠습니다.

답변1

이름에 포함된 날짜를 기준으로 파일 찾기

당신이 의미하는 경우진짜 파일 이름의 날짜를 필터링하려면 다음을 수행할 수 있습니다.

#!/bin/bash

read -p "Enter year (YYYY): " Y
read -p "Enter start month number: " SM
read -p "Enter start day number: " SD
read -p "Enter end month number: " EM
read -p "Enter end day number: " ED
read -p "Enter copy destination directory (with absolute path): " new_directory

# Do some rule-based checking here. I.e. input variables above
# should conform to expected formats...

# pad month and day numbers with zero to make the string 2 character long
SD="$(printf '%02d' $SD)"
SM="$(printf '%02d' $SM)"
ED="$(printf '%02d' $ED)"
EM="$(printf '%02d' $EM)"

# Make sure that the new directory exists
mkdir -p "$new_directory"

# Place the result of your filtered `find` in an array,
# but, before, make sure you set:
IFS=$'\n'  # in case some file name stored in the array contains a space
sdate="$Y$SM$SD"
edate="$Y$EM$ED"

array=( 
        $(find /directory/log -name "filename-*.gz" -execdir  bash -c '
            filedate="$(basename ${0#./filename-} .gz)";
            if (("${filedate:-0}" >= "${1:-0}")) && 
               (("${filedate:-0}" <= "${2:-0}")); then
                echo "$0"
            fi' {} "$sdate" "$edate" \;) 
      )

# loop over array, to copy selected files to destination directory
#for i in "${array[@]}"; do
#    # ensure that destination directory has full path
#    cp "$i" "$new_directory"
#done

# ... or much cheaper than a loop, if you only need to copy...
cp "${array[@]}" "$new_directory"

관련 정보