타임스탬프가 충분하지 않더라도 고유한 파일 이름을 가진 그림에 대한 심볼릭 링크를 반복적으로 생성합니다.

타임스탬프가 충분하지 않더라도 고유한 파일 이름을 가진 그림에 대한 심볼릭 링크를 반복적으로 생성합니다.

.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

관련 정보