재귀적으로 심볼릭 링크를 생성하고 1.JPG 파일이 존재하면 1A.JPG로 이름을 바꿉니다.

재귀적으로 심볼릭 링크를 생성하고 1.JPG 파일이 존재하면 1A.JPG로 이름을 바꿉니다.

나는 1년 동안 모든 사진에 대한 심볼릭 링크를 생성하는 쉘 스크립트를 가지고 있습니다. 사진은 다른 카메라에서 가져온 것이며 하위 디렉토리에 있습니다.

f=$(pwd);
export f;
q="2015/";
z="2015_Links/";
find $q/. \( -name "*.CR2" -o -name "*.JPG" \) -execdir sh -c 'ln -s "$PWD"/$(basename {}) "$f"/"$z"/Link_$(basename {})' {} \;

일부 사진의 파일 이름이 동일하여 오류가 발생합니다.

ln: failed to create symbolic link ‘2015_Links/Link_IMG_1588.CR2’: File exists

이 경우 기존 파일의 이름을 바꾸고 싶습니다. 예를 Link_IMG_1588.CR2들어 , Link_IMG_1588A.CR2.

답변1

이 문제에 대한 또 다른 해결책을 찾았습니다.

각 파일 이름이 고유하도록(IMG 번호 + 날짜) 다른 카메라의 사진 이름을 성공적으로 변경했습니다( find및 사용).exiv2

find 2015/. \( -name "*.CR2" -o -name "*.JPG" \) -execdir sh -c 'exiv2 -r':basename:_%Y%m%d_%H_%M_%S' rename $(basename {})' {} \;

답변2

전략:

  • 원하는 대상 파일 이름이 존재하는지 테스트합니다.
  • 그렇다면 숫자 접미사 등을 추가해 -1보세요 -2.

기타 개선 사항:

  • -exec … {} +성능을 약간 향상시키 려면 대신 사용하십시오 -execdir … {} \;. -execdir절대 링크를 만들기 때문에 여기서는 실제로 이것이 필요하지 않습니다 .
  • 내부 쉘 대신 에 사용하십시오 $x(또는 $1사용을 고집하는 경우 ). 절대 사용하지 마십시오 : 셸 조각 내에서 파일 이름을 셸 스크립트에 직접 삽입하므로 셸 구문으로 구문 분석되고 파일 이름에 셸 구문에서 특별한 의미를 갖는 문자가 포함되어 있으면 충돌이 발생합니다. 항상 별도의 매개변수로 전달됩니다.… {} \;{}{}find -exec{}

코드(테스트되지 않음):

find "$q/." \( -name "*.CR2" -o -name "*.JPG" \) -exec sh -c '
    for x; do
      base=$0/Link_${x##*/}; base=${base%.*}; ext=${x##*.}
      if [ -e "$target.$ext" ]; then
        suffix=1;
        while [ -e "${base}-$suffix.$ext"; do suffix=$((suffix+1)); done
      fi
      ln -s -- "$PWD/${x##*/}" "$target"
    done
  ' "$PWD/$z" {} +

관련 정보