
100ページを超えるPDFファイルを検索して、UNIX / LINUX端末から特定のディレクトリに移動しようとしています。このような:
find . -name '*.pdf' -pagenumber>100 -exec mv -t ~/directory
明らかに、-pagenumber>100
これは正しいコマンドではありません。特別な命令がありますか?
答え1
ここで難しいのは、PDF文書のページ数を数えることです。
ユーティリティfind
自体ではこれを行うことができないため、これを行うには外部ツールが必要です。
ほとんどのUnixシステムではインストールできますexiftool
。このツールはlibimage-exiftool-perl
UbuntuとOpenBSDパッケージの一部ですp5-Image-ExifTool
。 PDF文書のページ数を出力するなど、メディアファイルのメタデータに関連する多くのタスクを実行できます。
$ exiftool -s3 -PageCount document.pdf
10
これを使用して、find
100ページを超える文書を別のディレクトリに移動できます。
mkdir -p ~/tmp/100-plus-pages || exit
find . -name '*.pdf' -type f -exec sh -c '
for pathname do
if [ "$(exiftool -s3 -PageCount "$pathname")" -gt 100 ]; then
mv "$pathname" ~/tmp/100-plus-pages
fi
done' sh {} +
これは、見つかったPDFファイルのバッチの短いインラインスクリプトを呼び出します。インラインスクリプトは、見つかったファイルの現在の配置を繰り返し、exiftool
各ファイルに対してコマンドを実行します。コマンドで出力された数字が100を超えると、ファイルはディレクトリに移動100-plus-pages
します~/tmp
。
私たちはターゲットディレクトリからPDFファイルを検索するのを避けたいので、以下にそのディレクトリを作成することを選択しました~/tmp
(検索場所とは別のものですが、find
同じファイルシステムにあることを望むかもしれません)。現在のディレクトリに保存するには、次のように入力を避けることもできます。
mkdir -p 100-plus-pages || exit
find . -path ./100-plus-pages -prune -o -name '*.pdf' -type f -exec sh -c '
for pathname do
if [ "$(exiftool -s3 -PageCount "$pathname")" -gt 100 ]; then
mv "$pathname" 100-plus-pages
fi
done' sh {} +
mv
まず、置換を使用してテストを実行することもできますecho
。
答え2
poppler-utils
各PDFファイルでPdfinfo(Debianシステムの場合はパッケージ内)を実行し、それをAwkにパイプして行を見つけ、ページPages:
数が100を超える場合にのみ0(成功)で終了できます。
find . -name '*.pdf' -exec sh -c '
pdfinfo "$1" | awk "/^Pages:/{exit !(\$2>100)}"
' _ {} \; -exec mv {} ~/dir \;
\$2
Awkスクリプトは二重引用符内にあり、シェルは$2
位置引数に拡張されているため、エスケープする必要があることに注意してください。
awk
論理式は評価され、それをtrueとして(\$2>100)
返し、1
シェルはtrueをfind
使用するため、0
正しい終了コード=>を取得するには逆にする必要があります!(\$2>100)
。したがってawk
、両方を結合するときは、シェルとシェルの間の真と偽の逆の定義を考慮する必要があります。
Pdftkも同様の方法で使用できます:pdftk "$1" dump_data
;参照この回答PDFファイルのページ数を計算する方法の詳細をご覧ください。