타임스탬프를 기반으로 파일 이름을 바꾸는 스크립트를 작성하기 시작했습니다. 명령줄에서 해결했다고 생각했는데 스크립트로는 작동하지 않습니다. 스크립트가 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에서는 파일 대신 시간이 걸립니다.)--reference
date -r