パイプ入力に存在しないファイルの印刷

パイプ入力に存在しないファイルの印刷

多くのファイルを含む.PDFディレクトリがあります.JPG

.JPG.PDF各ファイルには同じ名前のファイルが必要です。ファイルがないファイルを
見つけるためにコマンドを使用しようとしています。.PDF.JPG

私の現在のコマンドは次のとおりです。

find -iname '*.jpg' -print0|sed 's/jpg$/pdf$/ig' |xargs -0 ls

これにより、: No such file or directoryファイルが存在しないというエラーが出力されます。
問題があるかls処理できないというエラーが表示されます。次のいずれかが私の問題を解決します。 grepsed

  • ls存在しないファイルのみをリストする方法は?
  • /filter ls/sedエラーを処理する方法はgrep
  • bashスクリプトファイルを生成せずにファイルの存在を確認する別の方法はありますか?

答え1

ループを使うべきだと思います

IFR=$'\0' # because you use -print0 on your find
for jpg_file in `find -iname '*.jpg' -print0`
do
  pdf_file=`echo "$jpg_file" | sed 's/jpg$/pdf/i'`
  if [ -e "$pdf_file" ]; then
    echo "$pdf_file exist"
  else
    echo "$pdf_file missing"
  fi
done

答え2

POSIXlyでは、次のことができます。

find . -name '*.[jJ][pP][gG]' -exec sh -c '
  for i do
    [ -e "${i%.*}.pdf" ] || printf "%s\n" "$i"
  done' sh {} +

PDFファイルを大文字と小文字を区別せずに検索するには、次の手順を実行します。

find . -name '*.[jJ][pP][gG]' -exec sh -c '
  for i do
    set -- "${i%.*}".[pP][dD][fF]
    case $1 in
      (*"]") printf "%s\n" "$i"
    esac
  done' sh {} +

答え3

zshを使用して、

setopt extendedglob
print -rl -- **/*.(#i)jpg(e{'[[ ! -e $REPLY:r.pdf ]]'})

そのファイルjpgがないファイルは報告されます。pdf

PDF検討して提出したい場合PdF

print -rl -- **/*.(#i)jpg(e{'f=($REPLY:r.(#i)pdf(N)); ((!$#f))'})

もちろん、印刷する代わりに、次のように繰り返すことができます。

for f (**/...) convert $f $f:r.pdf

:r与えられたルート名(つまり、拡張子なし)ファイル名(csh従来)、大文字と(#i)小文字を区別しないワイルドカードが設定されている場合(オンのextendedglob場合)、ファイルにワイルドカードを使用する必要があるかどうかを判断するためにe{some code}ワイルドカード修飾子が実行されます。some code

隠しファイル(名前がドットで始まるファイル)をスキップします。Dもう一度追加するには、ワイルドカード修飾子を追加してください。

答え4

これは次の点に役立ちます。

find . -iname '*.pdf' -exec bash -c '[[ -f $(echo $(echo {}|sed "s/pdf/jpg/")) ]] || echo $(echo {}|sed "s/pdf/jpg/") not found' \;

そのJPGファイルを持たないPDFファイルはエコーされます。

関連情報