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
몰랐습니다.