사람이 읽을 수 있는 마지막 편집 타임스탬프를 파일 이름에 추가합니다.

사람이 읽을 수 있는 마지막 편집 타임스탬프를 파일 이름에 추가합니다.

bash를 사용하여 파일이 마지막으로 변경된 시간을 파일 이름에 추가하고 싶습니다.

예를 들어 다음과 같이 출력됩니다 ls -la.

 -rw-rw-r-- 1 beginner beginner 5382 Dec  1 17:18 B_F1-1.xml

되어야 한다

 -rw-rw-r-- 1 beginner beginner 5382 Dec  1 17:18 B_F1-1_20141201T1718.xml

.의 모든 파일에 대해 어떻게 이 작업을 수행할 수 있습니까?

답변1

다음과 같이 시도해 볼 수 있습니다.

EXT=${FILE#*.}
NAME=${FILE%%.*}

mv "$FILE" "$NAME$(date --reference "$FILE" '+%Y%m%dT%H%M').$EXT"

스크립트에서 date지원 하는 경우 --reference참조된 파일의 마지막 수정 날짜를 가져옵니다.

답변2

나는 이것이 효과가 있다고 생각합니다 :

for i in *; do 
   fileTime=$(stat -c %Y "$i");  #Get last modification (since EPOCH)
   formatDate=$(date +%Y%m%dT%H%m -d @"$fileTime"); #Get time in format YYYYMMDDTHHmm
   mv "${i%%.*}"_"$formatDate"."${i#*.}"; #Appends "formatDate" before extension
done

인사.

답변3

이 모든 작업은 oneliner로 수행할 수 있습니다.

for i in *.* ; do mv "$i" "${i%.*}_$(date --reference "$i" +%Y%m%dT%H%M).${i##*.}"; done

문자 그대로의 의미타임스탬프, 이는 에포크 이후의 초 수입니다. 다음을 사용할 수 있습니다.

for i in *.* ; do mv "$i" "${i%.*}_$(date --reference "$i" +%s).${i##*.}"; done

이것은 안전 검사를 포함하며 이름에 점이 포함된 파일에서만 작동합니다. 이름에 공백이 있는 파일을 올바르게 처리합니다(종종 그렇듯이). 점으로 구분된 필드는 파일 이름이고 나머지 필드는 확장자입니다.

나는 이 옵션에 대해 --reference몰랐습니다.

관련 정보