배치 파일 이름 바꾸기: 파일 이름이 중복된 파일 삭제를 방지하기 위해 임의 ID보다 더 나은 방법은 무엇입니까?

배치 파일 이름 바꾸기: 파일 이름이 중복된 파일 삭제를 방지하기 위해 임의 ID보다 더 나은 방법은 무엇입니까?

다양한 사람들이 다양한 장치(전화, 카메라 등)를 사용하여 다양한 각도에서 찍은 과거 휴가 사진 묶음의 이름을 바꾸고 싶습니다. 방금 나를 돕기 위해 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

관련 정보