2017-01-30 5 views
0

폴더 구조에서 파일의 그림 날짜를 파악하려고합니다. 일부 폴더 이름에는 공백이 포함됩니다. 이제 따옴표를 설정하려고 시도하지만 작동하지 않습니다.파일을 열 수 없습니다.

누구든지 내게 힌트를 줄 수 있습니까?

find . -name "*.jpg" -or -name "*.JPG" >> files.txt 
    sed -e "s/\(.*\)/'\1'/" files.txt >> files2.txt 
    for fn in `cat files2.txt`; do 
    DATEI=$(echo "$fn" | cut -c 3-) 
    EXIF=$(/usr/bin/exiv2 -pa --grep DateTimeOriginal "'"$PWD$DATEI | awk -F" " '{print $4","$5}') 
    if [ -z "$EXIF" ] 
    then 
    : 
    else 
    echo "$PWD$DATEI,$EXIF" >> ausgabe.csv 
    fi 
done 
echo "DONE!" 

편집 :

'/volume1/Intern/path/to/images/IMG_4206.jpg': Failed to open the file 
+0

디버깅 코드를 추가하거나 줄이면 오류 메시지를 생성하는 행을 식별 한 다음 수정합니다. 오류 메시지를 생성 할 수있는 코드의 약 4 ~ 5 줄 밖에 없으므로이 질문을 게시하는 데 많은 시간이 걸립니다. –

답변

0

내가 당신의 결과는 다음,

"/path/to/photo1.jpg","2017:01:15","22:19:15" 
"/path/to/another/photo.JPG","2017:01:15","22:10:01" 

처럼 사진에 대한 절대 경로를 볼 예정이다 걸릴 : 이것은 내가 얻을 그 출력 DateTimeOriginal 날짜/시간을 모두 인용 부호로 묶습니다.

exiv2 실제로 파일 인수에 여러 장의 사진을 걸릴 수 있으므로 전체 프로세스는이 명령의 파이프 라인을 단순화 할 수 있습니다

# Need this for the fileglob 
shopt -s globstar extglob 

exiv2 -pa -g DateTimeOriginal **/*[email protected](jpg|JPG) | 
awk -v pwd="$PWD/" -v dq='"' -v OFS=',' '{ 
    fn = substr($0, 1, match($0,/*Exif\.Photo/)-1) 
    print dq pwd fn dq, dq $(NF-1) dq, dq $NF dq 
}' 

쉘 옵션 globstarextglob**/*.*@(jpg|JPG) 표현을 가능하게하는 전체 디렉토리 트리에 대해 jpg 또는 JPG으로 끝나는 모든 파일을 반환합니다.

exiv2DateTimeOriginal 데이터를 포함하는 파일에 대해서만 무엇인가를 반환합니다.

dir1/photo1.jpg  Exif.Photo.DateTimeOriginal Ascii 20 2017:01:22 10:20:36 
dir1/photo3.jpg  Exif.Photo.DateTimeOriginal Ascii 20 2017:01:22 10:20:36 
dir with space/photo2.JPG Exif.Photo.DateTimeOriginal Ascii 20 2017:01:22 10:20:38 
dir with space/photo4.JPG Exif.Photo.DateTimeOriginal Ascii 20 2017:01:22 10:40:09 
photo5.jpg   Exif.Photo.DateTimeOriginal Ascii 20 2017:01:24 20:06:38 
photo6.JPG   Exif.Photo.DateTimeOriginal Ascii 20 2017:01:22 10:00:55 

이 AWK와 간단한 것, 공백 경로를 위해 그것을하지 않았다 질문에서 언급 한 바와 같이 : 중간 출력은 다음과 같이 (제거 일부 공백)을 보인다. exiv2 출력 공간 분리 및 탭을 얻을 수있는 옵션이있을 것 같지 않기 때문에 일부 AWK의 속임수가 필요합니다 :

  • 다음에 슬래시가 현재 디렉토리의 경로,의에 전달 명령은 -v pwd="$PWD/"입니다.
  • 지저분한 탈출을 피하기 위해 큰 따옴표를 -v dq='"'으로 정의합니다.
  • 출력 필드 구분 기호는 -v OFS=',' 인 쉼표로 설정됩니다.
  • 파일 이름을 얻으려면 Exif.Photo이 오는 일련의 공백 색인을 검색 한 다음 해당 색인 바로 앞에서 끝나는 부분 문자열을 fn에 할당합니다.
  • 따옴표로 묶어 쉼표로 구분하여 인쇄하려면 dq 변수를 사용하고 파일 이름 앞에 pwd 경로를 추가하고 $(NF-1)$NF을 사용하여 두 번째 필드와 마지막 필드를 각각 가져옵니다.

결과는 재 > ausgabe.csv 명령에 추가되어야한다,

"/home/benjamin/tinker/space dir/dir1/photo1.jpg","2017:01:22","10:20:36" 
"/home/benjamin/tinker/space dir/dir1/photo3.jpg","2017:01:22","10:20:36" 
"/home/benjamin/tinker/space dir/dir with space/photo2.JPG","2017:01:22","10:20:38" 
"/home/benjamin/tinker/space dir/dir with space/photo4.JPG","2017:01:22","10:40:09" 
"/home/benjamin/tinker/space dir/photo5.jpg","2017:01:24","20:06:38" 
"/home/benjamin/tinker/space dir/photo6.JPG","2017:01:22","10:00:55" 

같은 파일에이를 얻는 것입니다.


명령이 작동하지 않는 이유는 하나의 파일을 예로 들어 보겠습니다. sed 단계 후에, 당신은 './photo5.jpg'과 같은 것을 가지고 있습니다.이제 을 사용하면 이됩니다. 당신의 EXIF 라인에서

, 당신은 이제 exiv2이 존재하지 않는 작은 따옴표 –을 포함하여 문자 그대로 '/photo5.jpg'라는 파일을 찾고, 또 다른 작은 따옴표를 추가합니다.