생성 시간을 기준으로 여러 파일의 이름을 바꾸는 방법은 무엇입니까?

생성 시간을 기준으로 여러 파일의 이름을 바꾸는 방법은 무엇입니까?
#!/bin/sh
for f in *.png
do
    echo mv -n "$f" "$(date +%Y%m%d-%H-%M-%S)_$f"
done

() 에 설명된 대로 타임스탬프를 사용하여 여러 파일의 이름을 바꾸고 싶지만 ls -lt --full-time위 코드를 실행하면 이름이 현재 날짜/시간 또는 수정 시간을 사용합니다. yymmdd 형식의 연도, 월, 일을 원합니다.

답변1

심볼릭 링크가 해결된 후 파일의 마지막 수정 시간에 해당하는 날짜를 보고하는 -rGNU 옵션을 사용하세요 (예: this ).datels -Ll

#!/bin/sh -
for f in *.png
do
  t=$(date -r "$f" +%Y%m%d-%H-%M-%S) &&
    echo mv -n -- "$f" "${t}_$f"
done

또는 내장 함수를 사용하여 zsh어떤 stat 형식으로든 시간 형식을 지정하세요.

#! /bin/zsh -
zmodload zsh/stat || exit

for f (*.png(N))
  stat -A t -F %Y%m%d-%H-%M-%S +mtime -- $f &&
    print -r mv -n -- $f ${t}_$f

statGNU 및 BSD를 포함한 일부 시스템은 완전히 다른 API(zsh와 서로)를 사용함에도 불구하고 자체 명령을 추가했습니다(훨씬 나중에1) .

exiftool또한 해당 속성을 기반으로 파일 이름을 바꿀 수도 있습니다.

exiftool -d %Y%m%d-%H-%M-%S '-FileName<${FileModifyDate}_${FileName}' -- *.png

이 모든 것과 함께 파일의 마지막 수정 시간을 확인 하십시오 ls -lt --full-time(이러한 png 파일 중 일부가 심볼릭 링크인 경우 추가 파일이 있어야 할 것입니다 ). -L이는 파일 내용의 생성 시간으로 생각할 수 있으며 일반적으로 관심 있는 부분입니다. Linux의 파일에는 소위출생 시간또한 ~으로 알려진생성 시간이는 파일이 생성된 시간을 반영합니다(그러나 콘텐츠가 생성된 시간과는 거의 관련이 없음).

ls최신 커널과 GNU libc(CentOS에는 없음) 가 있는 최신 ls --time=birth -Ll --full-time버전 의 GNU stat의 경우 API를 사용하여 stat -Lc %w검색 할 수 있습니다 date. 이를 수행하는 API는 최근 매우 복잡하며 Linux에 따라 다릅니다. 그리고 그 타임스탬프는 일반적으로 쓸모가 없습니다. 바라보다statexiftool파일이 생성되면또는Linux 커널에는 아직 파일 생성 날짜를 얻을 수 있는 인터페이스가 없습니까?더 알아보기.


1 그러나 이전 버전의 Unix에는 명령이 있었습니다 stat. 어떤 이유에서인지 Unix v6에 대한 연구에서는 더 이상 이 기능이 없기 때문에 70년대 중반에 사라진 것 같습니다.

답변2

stat파일 날짜를 얻으려면 명령을 사용해야 합니다 . 파일의 생성일(생년월일)이나 수정일을 얻고 싶은지 모르겠습니다. 이 두 날짜를 사용하여 예를 제공하겠습니다.

생년월일 사용

#!/bin/sh
for f in *.png
do
    cdate=$(stat -c '%w'  "$f" | cut -d ' ' -f1)
    echo mv -n "$f" "${cdate}_$f"
done

수정된 날짜 사용

#!/bin/sh
for f in *.png
do
    mdate=$(stat -c '%y'  "$f" | cut -d ' ' -f1)
    echo mv -n "$f" "${mdate}_$f"
done

stat -c '%w' somefile생성일/생년월일을 확인할 수 있으며, 수정일도 확인할 수 있습니다 stat -c '%y' somefile.

위의 코드는 YYYYMMDD형식으로 날짜를 반환합니다. 형식을 얻으려면 YYMMDD매개변수 확장을 적용할 수 있습니다(POSIX에서 지원하는지 여부는 확실하지 않습니다 sh). 다음은 또 다른 예입니다(bash 사용).

생년월일 사용

#!/bin/bash
for f in *.png
do
    cdate=$(stat --printf='%.10w\n' "$f")
    echo mv -n "$f" "${cdate#??}_$f"
done

수정된 날짜 사용

#!/bin/bash
for f in *.png
do
    mdate=$(stat --printf='%.10y\n' "$f")
    echo mv -n "$f" "${mdate#??}_$f"
done

stat --printf='%.10w\n'또는 를 사용하여 stat --printf='%.10y\n'날짜 형식을 나타내는 문자열의 처음 10자를 얻었습니다 YYYYMMDD. ${cdate#??}또는 를 사용하여 ${mdate#??}날짜의 처음 두 자리를 제거하면 YYMMDD해당 날짜 형식을 얻을 수 있습니다.

관련 정보