나는 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" {} +