このコードを短くする方法を教えてください。
find /home/peace/* -iname "*.pdf" -exec pdfgrep -i yello {} \; -exec cp {} /home/peace/Desktop/yello \;
find /home/peace/* -iname "*.pdf" -exec pdfgrep -i green {} \; -exec cp {} /home/peace/Desktop/green \;
find /home/peace/* -iname "*.pdf" -exec pdfgrep -i blue {} \; -exec cp {} /home/peace/Desktop/blue \;
find /home/peace/* -iname "*.pdf" -exec pdfgrep -i grey {} \; -exec cp {} /home/peace/Desktop/grey \;
find /home/peace/* -iname "*.pdf" -exec pdfgrep -i black {} \; -exec cp {} /home/peace/Desktop/black \;
find /home/peace/* -iname "*.pdf" -exec pdfgrep -i white {} \; -exec cp {} /home/peace/Desktop/white \;
答え1
そしてzsh
:
#! /bin/zsh -
cd /home/peace || exit
set -o extendedglob # for (#i)
pdf=(*.(#i)pdf(.ND)) # all pdf files case insensitive, including hidden ones
# in the current directory, only considering regular files.
colors=(yello green blue grey black white)
(($#pdf)) || exit 0 # exit with success if there's no pdf file (job already done)
ret=0
for color ($colors) {
files=(${(0)"$(pdfgrep -ilZe $color -- $pdf)"}) # all files containing the color
# using NUL-delimited records
if (($#files)) { # some files were found
mv -i -- $files Desktop/$color/ || ret=$? # move them, record failures
pdf=(${pdf:|files}) # remove the files from the list as we've moved them
}
}
exit $ret
これにより、呼び出し回数とpdfgrep
ディレクトリ読み取り回数が最小限に抑えられます。/home/peace
答え2
改善の余地が少し見えます。
findの最初のパラメータはディレクトリであり、最後に「*」があるパスではありません。
findはサブディレクトリ内で検索するため、「find」がサブディレクトリから検索されないように制限しようとします(find引数「-maxlength 1」)。
"something.pdf"というディレクトリがある場合、結果が気に入らない可能性があるため、検索結果をファイルに制限します(パラメータ「-type f」を検索)。
cp /home/peace/Desktop/yelloの2番目のパラメータは結果ファイル名ですか?しかし、pdfgrepが複数のPDFファイルで「yello」を見つけることができる場合、正しい結果は何ですか? "/home/peace/Desktop/yello"がディレクトリの場合は、最後に "/"を追加する必要があります。だから私はこれが私たちが結果ファイルを置くディレクトリだと思います。
それでは始めましょう。
find /home/peace/ -maxdepth 1 -type f -iname "*.pdf" -exec sh -c '
for f do
for i in yello green blue grey black white; do
pdfgrep -iqe "$i" "$f" &&
cp -f "$f" "/home/peace/Desktop/$i/"
done
done' sh {} +
結果のディレクトリが存在することを確認するためにチェックを追加することもできます。