awk와 함께 bash 스크립트를 사용하여 타임스탬프를 사용하여 파일 이름 바꾸기

awk와 함께 bash 스크립트를 사용하여 타임스탬프를 사용하여 파일 이름 바꾸기

타임스탬프를 기반으로 파일 이름을 바꾸는 스크립트를 작성하기 시작했습니다. 명령줄에서 해결했다고 생각했는데 스크립트로는 작동하지 않습니다. 스크립트가 awk 라인에 정지됩니다.

이것은 지금까지의 작은 스크립트입니다.

#!/bin/bash
#renamePhotos.sh
#  a script to rename photos in current directory based on date
#  to be expanded

#  OUTPUT in $(ls -tr *.JPG); 
LIST="$(ls --full-time -tr *.JPG)"
echo "Starting..."

for i in "$LIST"; do
    echo  $(awk '{ print $6 }' | awk 'BEGIN { FS = "-" }; { print $1 }')
    echo
done

답변1

이 줄에서:

echo  $(awk '{ print $6 }' | awk 'BEGIN { FS = "-" }; { print $1 }')

명령 대체의 첫 번째 awk는 입력을 지정하지 않으므로 터미널에 연결된 stdin에서 읽습니다. 즉, 사용자가 입력할 때까지 기다립니다.

쉘 변수에서 일부 입력을 제공하려면 다음과 같이 파이프할 수 있습니다.

echo "$var" | awk...

echo는 명령의 출력만 인쇄하기 때문에 이렇게 하는 것이 echo $(foo bar)이상해 보입니다 . foo bar이는 독립 실행형으로 실행한 경우 어떤 경우에도 발생합니다. foo bar(단어 분사를 제외하고는 아마도 당신이 원하는 것이 아닐 것입니다.)

for 루프도 있습니다.

for i in "$LIST"; do

한 번만 실행되고 i값으로 설정됩니다 LIST. 인용되어 있기 때문에 $LIST토큰화를 거치지 않고 for목록에 하나의 항목만 보입니다. 그러나 따옴표 없이 이 작업을 수행하면( 에 표시된 대로) for i in $LIST; do...공백으로도 구분된다는 것을 알 수 있습니다. IFS이를 방지하려면 개행 문자를 설정해야 합니다 .

그 이후에도 가능한 문제는 출력이 ls약간 까다로울 수 있다는 것입니다. 시간 형식은 로케일에 따라 변경될 수 있으며(그런 일이 발생하는지 확실하지는 않지만 --full-time) 파일 이름에서 인쇄할 수 없는 문자가 깨질 수 있습니다. 로케일을 알고 있고 파일 이름이 "좋은" 경우 작동할 수 있습니다.

또 다른 방법은 쉘이 파일을 찾도록 하고 date --reference $file(사용 가능한 경우) 다음과 같은 것을 사용하여 날짜를 얻는 것입니다.

for f in *.jpg ; do 
    d=$(date +"%Y-%m-%d" -r "$f")  
    echo "$d $f" 
done

(GNU coreutils에는 플래그 date가 있습니다 . OS X에서는 파일 대신 시간이 걸립니다.)--referencedate -r

관련 정보