多くのファイルを含む.PDF
ディレクトリがあります.JPG
。
.JPG
.PDF
各ファイルには同じ名前のファイルが必要です。ファイルがないファイルを
見つけるためにコマンドを使用しようとしています。.PDF
.JPG
私の現在のコマンドは次のとおりです。
find -iname '*.jpg' -print0|sed 's/jpg$/pdf$/ig' |xargs -0 ls
これにより、: No such file or directory
ファイルが存在しないというエラーが出力されます。
問題があるかls
処理できないというエラーが表示されます。次のいずれかが私の問題を解決します。 grep
sed
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ファイルはエコーされます。