올바른 생성 날짜가 있는 타임스탬프의 파일 이름 수정 [닫기]

올바른 생성 날짜가 있는 타임스탬프의 파일 이름 수정 [닫기]

.creation time

**shell script**이제 모든 폴더를 반복할 수 있는 파일을 작성하려고 합니다 . > 생성 시간을 추출하고 이를 파일 이름 타임스탬프로 바꾸세요. 다음은 작은 예입니다.

타임스탬프가 잘못된 원본 파일 이름:
파일 이름,생산 일, 수정일
20180524010500530_FR785101.jpg, 2018-05-24 00:05:00, 2018-05-24 00:05:34

출력은 다음과 같습니다:
파일 이름,생산 일, 수정일
20180524000500530_FR785101.jpg, 2018-05-24 00:05:00, 2018-05-24 00:05:34

이것이 쉘 스크립트로 달성될 수 있는지 누가 말해 줄 수 있습니까? 그렇다면 이 ls명령이나 작업을 수행할 수 있는 다른 명령을 사용하는 방법을 안내해 줄 수 있는 사람이 있습니까 ?

명령 을 사용하여 직접 기록을 시작했지만 ls생성 시간을 추출하여 파일 이름 타임스탬프로 바꾸는 방법을 알 수 없으며 이미지 파일이 포함된 모든 폴더 및 하위 폴더에 대해 스크립트를 실행하는 방법도 모릅니다. ,

답변1

명령을 사용하여 stat파일 생성 시간을 얻을 수 있습니다.

CREATION_TIME=`debugfs -R 'stat /path/to/file' /dev/sdaX | awk -F '-' '/crtime/{print $NF}'`

touch명령을 사용하여 수정 날짜를 변경할 수 있습니다 .

touch -d "$CREATION_TIME" file

답변2

다음은 귀하가 제공한 파일 이름 형식을 엄격하게 사용하여 이 작업을 수행하는 스크립트입니다. 모든 파일이 먼저 날짜/시간으로 시작하고 1시간 지연만 수정하면 된다고 가정합니다. epoch 시간을 사용하여 파일 이름의 시간에서 1시간을 빼고 파일 이름을 바꿉니다.

스크립트의 디렉터리를 로컬 디렉터리로 변경합니다.

루퍼.sh

    #!/bin/bash

    echo "Sending directory to the past."

    for path in /path/to/directory/*.jpg; do
      filename=${path##*/}
      #Convert to date format
      oldDate="${filename:0:4}-${filename:4:2}-${filename:6:2} ${filename:8:2}:${filename:10:2}:${filename:12:2}"
      #Get the epoch date
      epochDate=$(date -d "$oldDate" +%s)
      #Subtract 1 hour
      epochDate=$(( $epochDate - 60*60 ))
      #Converting and formating the new date
      newDate=$(date -d @$epochDate +%Y%m%d%H%M%S)
      #New filename
      newFilename=$(dirname $path)/$newDate"${filename:14}"
      #Renaming the file
      mv $path $newFilename
    done

편집: 이름을 바꾸기 전에 생년월일을 비교하는 스크립트는 다음과 같습니다. (만일을 대비해 꼭 백업해두세요)

#!/bin/bash

echo "Sending directory to the past."

for path in /path/to/directory/*.jpg; do
  filename=${path##*/}
  #Convert to date format
  oldDate="${filename:0:4}-${filename:4:2}-${filename:6:2} ${filename:8:2}:${filename:10:2}:${filename:12:2}"
  #Get the epoch date
  epochDate=$(date -d "$oldDate" +%s)
  #Birth date - Only works if your filesystem supports it.
  birthDate=$(stat $path | grep 'Birth:' | sed 's/\..*//' | awk '{print $2" "$3}')
  epochBirthDate=$(date -d "$birthDate" +%s)
  if [ $epochDate != $epochBirthDate ]; then
    #Subtract 1 hour
    epochDate=$(( $epochDate - 60*60 ))
    #Converting and formating the new date
    newDate=$(date -d @$epochDate +%Y%m%d%H%M%S)
    #New filename
    newFilename=$(dirname $path)/$newDate"${filename:14}"
    #Renaming the file
    mv $path $newFilename
  fi
done

관련 정보