.CR2
내 카메라의 사진에는 .JPG
정확한 EXIF 날짜 + 시간이 있지만 불행히도 밀리초가 아니라 초 단위입니다. 따라서 일부 사진의 date_time 값은 동일합니다(동일한 초에 촬영됨). 사진은 하위 폴더에 저장되므로 exiv2는 날짜_시간만으로 모든 폴더에서 고유한 파일 이름을 만들 수 없습니다. 초기 상황 예:
Folder 1 / 2016_12_01_1326.JPG
Folder 1 / 2016_12_02_1830.CR2
Folder 2 / 2016_12_01_1326.JPG (same date, hours, and seconds but not milliseconds)
내 모든 사진에 대해 고유한 이름을 가진 심볼릭 링크를 만들고 싶습니다. 이 문제를 해결하기 위한 나의 아이디어는 exiv4를 통해 사진의 파일 이름을 날짜/시간으로 변환하고 동일한 이름과 연속 번호가 매겨진 심볼릭 링크를 사용하는 것이었습니다.
따라서 최종 심볼릭 링크 결과는 다음과 같습니다.
2016_12_01_1326_0001.JPG
2016_12_01_1326_0002.JPG
2016_12_02_1830_0003.CR2
내 방법은 다음과 같지만 진행중인 숫자에서는 작동하지 않습니다.
f=$(pwd);
export f;
var=0; export var;
find 2016/. \( -name "*.CR2" -o -name "*.JPG" \) -execdir sh -c 'ln -s "$PWD"/$(basename {}) "$f"/2016_Links/Pictures/Link_"$((var++))"_$(basename {})' {} \;
$((var++))
다음 오류로 인해 작동하지 않습니다.
./20160312_09_02_42.CR2: 1: ./20160312_09_02_42.CR2: arithmetic expression: expecting primary: "var++"
답변1
문제는 "-execdir"에 의해 시작된 하위 쉘에서 "var"가 증가하므로 상위 쉘이 변경된 값을 얻을 수 없다는 것입니다. 이 경우 find는 진행 상황을 추적하지 않기 때문에 find를 사용하여 모든 작업을 수행할 수 없습니다.
다음은 원하는 링크 이름과 find 명령에서 거의 사용한 링크 이름을 포함하는 솔루션입니다. 원하는 링크 이름을 사용해 보세요.
export var=0
for F in $(find 2016 \( -name "*.CR2" -o -name "*.JPG" \)); do
FL=${F##*/}
echo ln -s "$PWD/${F}" "$PWD/2016_Links/Pictures/${FL%.*}_$(printf "%04d" $((var++))).${FL##*.}"
# or
echo ln -s "$PWD/${F}" "$PWD/2016_Links/Pictures/Link_$((var++))_${F##*/}"
done
편집하다:이름에 공백이 포함된 경우 먼저 따옴표가 필요하며 다른 루프를 약간 변경하면 문제가 해결됩니다.
export var=0
find 2016 \( -name "*.CR2" -o -name "*.JPG" \) | while read F; do
FL=${F##*/}
echo ln -s "$PWD/${F}" "$PWD/2016_Links/Pictures/${FL%.*}_$(printf "%04d" $((var++))).${FL##*.}"
# or
echo ln -s "$PWD/${F}" "$PWD/2016_Links/Pictures/Link_$((var++))_${F##*/}"
done