以下には、~/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アップデート/アップグレード
同様の質問/回答を複数読んだが、キーを取得できませんでした。
編集する:
ロケールの問題のために(そしてより多くの情報があるため)、exciptoolを使用するソリューションとしてマークされた答えにコメントとして投稿したので、誰かがこれを使用するのが役に立つかもしれません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"