
다양한 사람들이 다양한 장치(전화, 카메라 등)를 사용하여 다양한 각도에서 찍은 과거 휴가 사진 묶음의 이름을 바꾸고 싶습니다. 방금 나를 돕기 위해 bash 스크립트를 작성했습니다.
#!/bin/bash
for f in *; do
# generate random id to prevent deletion of files with duplicate names
randomid=$(tr -dc "[:alnum:]" < /dev/urandom | head -c 10)
# add modification date and time including seconds to the filename, attach location and random id
mv -- "$f" "$(date +%Y-%m-%d-%R:%S -r "${f}")_location_${randomid}.jpg";
done
결과는 다음과 같은 이름의 파일입니다.2016-08-09-15:56:24_location_uPe38A20tn.jpg
같은 날, 두 번째로 찍은 사진이 있어서 무작위로 ID를 추가해야 했고, 그 과정에서 파일명이 중복되어 삭제되기도 했습니다.
무작위 ID를 사용한다는 제 생각 외에, 같은 날짜, 같은 초에 찍은 사진이 삭제되지 않도록 하는 다른 방법이 있나요?
당신의 도움을 주셔서 감사합니다!
답변1
그러면 1, 2, 3 등의 반복되는 숫자가 제공됩니다.
dest=$(date +%Y-%m-%d-%R:%S -r "${f}")_location_
id=
while [ -f "$dest""$id".jpg ] ; do
((id++))
done
dest="$dest""$id".jpg
mv -- "$f" "$dest"
for f in *
루프 내부에 배치해야 합니다 .
답변2
여기서는 무작위 차별화에 대한 타당한 이유가 없습니다. 파일을 구별할 수 있는 자연스러운 이름이 없다면 카운터를 사용하는 것이 더 친숙해 보입니다. 간단한 해결책은 시스템의 전역 카운터를 사용하는 것입니다.
counter=1
for f in *; do
base="$(date +%Y-%m-%d-%R:%S -r "${f}")_location_"
mv -- "$f" "$base_$counter.jpg"
counter=$((counter+1))
done
충돌이 발생한 경우에만 카운터를 사용하려면 이름을 바꾸기 전에 파일 이름을 테스트하십시오.
for f in *; do
base="$(date +%Y-%m-%d-%R:%S -r "${f}")_location_"
set -- "$base"*.jpg
if [ -e "$1" ]; then
if [ "$1" = "$base.jpg" ]; then
mv "$base.jpg" "$base_1.jpg"
fi
mv "$base.jpg" "$base_$(($#+1)).jpg"
else
mv -- "$f" "$base.jpg"
fi
done
(경고, 테스트되지 않은 코드)
답변3
다음은 스크립트에 대한 몇 가지 작은 개선 사항입니다. 중복 가능성이 있는지 묻는 메시지를 표시하고 파일 확장자를 고려합니다.
#!/bin/bash
# for each file
for f in *.{jpg,jpeg}; do
# generate random id to prevent deletion of duplicates
randomid=$(tr -dc "[:alnum:]" < /dev/urandom | head -c 10)
# add modification date and time (divided by dashes) to the current filename
# -i prompts on possible duplicates.
mv -i -- "$f" "$(date +%Y-%m-%d-%R:%S -r "${f}")_location_${randomid}.jpg";
done