아래에는 ~/Pictures
jpeg를 포함하는 일부 하위 디렉터리가 있습니다(예
~/Pictures/Pics 1/img.jpg
: .
에서 bash
:
~/Pictures $ `file Pics\ 1/img.jpg`
산출:
Pics 1/img.jpg: JPEG image data, Exif standard:: [TIFF image data,
little-endian, direntries=12, description=....
내가 script.sh
만들고chmod a+x
#!/bin/bash
VAR=$(builtin printf "%q" "$1")
CMD="file $VAR"
EXIF=eval "$CMD"
echo "$EXIF"
~/Pictures $ ./script.sh Pics\ 1/img.jpg
산출:
./script.sh: line 4: file Pics\ 1/img.jpg: No such file or directory
또한 img.jpg의 전체 경로를 시도하고/usr/bin/file
OS: Raspbian 업데이트/업그레이드
유사한 질문/답변을 여러 개 읽었지만 키를 얻지 못했습니다.
편집하다:
로케일 문제로 인해 (그리고 더 많은 정보가 있기 때문에) 엑시프툴을 사용할 솔루션으로 표시된 답변에 주석으로 게시했으므로 누군가 이것을 사용하는 것이 유용할 수도 있습니다 exiftool
. 스크립트.sh:file
#!/bin/bash
COMM="/usr/bin/exiftool -Description \"$1\""
DESCR=$(eval "$COMM")
DESCRIPTION=${DESCR#"Description : "}
echo "$DESCRIPTION"
메타데이터를 올바르게 출력합니다.설명하다특수문자 포함
답변1
스크립트에서 미묘하게 인용할 필요가 없습니다. 큰따옴표 $1
(및 기타 변수)가 확장되었는지 확인하세요 .
#!/bin/bash
exif=$( file "$1" )
printf '%s\n' "$exif"
그렇지 않으면
#!/bin/bash
file "$1"
달리기:
./script.sh Pics\ 1/img.jpg
또는,
./script.sh "Pics 1/img.jpg"
또는,
./script.sh "Pics 1"/img.jpg
스크립트에서 일어나는 일은 \
경로 이름의 일부를 생성한다는 것입니다. 이는 경로 이름의 일부가 아니며 단지 명령줄에서 공백을 이스케이프 처리하기 위한 것입니다.
또한 eval
명령 실행 중에 환경 변수에 문자열을 할당할 수 있습니다. 아마 그럴 수도 있지만 필수는 아닙니다(위 참조).EXIF
file
EXIF=$( eval "$CMD" )
만약 너라면진짜file
전체 명령을 변수에 저장 하려면 배열을 사용해야 합니다.
#!/bin/bash
cmd=( file "$1" )
exif=$( "${cmd[@]}" )
printf '%s\n' "$exif"
다시 말하지만 여기서는 필요하지 않습니다 eval
.
...이것을 작성하더라도 /bin/sh
(배열은 없지만 분명히 사용 가능한 위치 인수 목록이 있습니다 bash
):
#!/bin/sh
set -- file "$1"
exif=$( "$@" )
printf '%s\n' "$exif"