名前パターンでファイルを検索し、そのディレクトリでコマンドを実行するには?

名前パターンでファイルを検索し、そのディレクトリでコマンドを実行するには?

次のコマンドは、すべての請求書pdfファイルを検索し、サムネイルファイルが同じディレクトリにあることを確認します。そうでない場合は、ディレクトリを印刷する必要があります。後でサムネイルを生成するコマンドを追加します。

find . -maxdepth 2 -type f -name "invoice_*.pdf" -exec sh -c '[ -f "$(dirname {})/thumbnail.jpeg" ] || echo {}' ';'

コマンドは実行中ですが、ファイルパスに加えて以下が表示されます。

sh: 1: Syntax error: "(" unexpected (expecting ")")

ファイルパスがコマンドとして解釈されるようです。

答え1

(ファイル名の1つに引用符がなく、引用符がありません。

努力する:

find . -mindepth 3 -maxdepth 3 -type f -exec sh -c '[ -f "$(dirname '"'{}'"')/thumbnail.jpeg" ] || echo "{}"' \;

'"'{}'"'ファイル名にaがある場合は、dirnameコマンドに二重引用符を渡して引用符を実行します。(この'[ -f .. ]'コマンドには二重引用符が必要で、echoコマンドも同じです!

スクリプトを呼び出してパスをパラメータとして渡す方が簡単な場合があるため、複数の参照レイヤと代替レイヤfindについて考える必要はありません。たとえば(テストされていません):

$ cat script
#!/bin/bash --
dir=$(dirname "${1}")
[ -f "${dir}/thumbnail.jpeg" ] || echo "${1}" 

$ find . -mindepth 3 -maxdepth 3 -type f -exec ./script '{}' \;

関連情報