100ページを超えるPDFファイルを検索して、UNIX / LINUX端末のディレクトリに移動します。

100ページを超えるPDFファイルを検索して、UNIX / LINUX端末のディレクトリに移動します。

100ページを超えるPDFファイルを検索して、UNIX / LINUX端末から特定のディレクトリに移動しようとしています。このような:

find . -name '*.pdf' -pagenumber>100 -exec mv -t ~/directory

明らかに、-pagenumber>100これは正しいコマンドではありません。特別な命令がありますか?

答え1

ここで難しいのは、PDF文書のページ数を数えることです。

ユーティリティfind自体ではこれを行うことができないため、これを行うには外部ツールが必要です。

ほとんどのUnixシステムではインストールできますexiftool。このツールはlibimage-exiftool-perlUbuntuとOpenBSDパッケージの一部ですp5-Image-ExifTool。 PDF文書のページ数を出力するなど、メディアファイルのメタデータに関連する多くのタスクを実行できます。

$ exiftool -s3 -PageCount document.pdf
10

これを使用して、find100ページを超える文書を別のディレクトリに移動できます。

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 \;

\$2Awkスクリプトは二重引用符内にあり、シェルは$2位置引数に拡張されているため、エスケープする必要があることに注意してください。

awk論理式は評価され、それをtrueとして(\$2>100)返し、1シェルはtrueをfind使用するため、0正しい終了コード=>を取得するには逆にする必要があります!(\$2>100)。したがってawk、両方を結合するときは、シェルとシェルの間の真と偽の逆の定義を考慮する必要があります。

Pdftkも同様の方法で使用できます:pdftk "$1" dump_data;参照この回答PDFファイルのページ数を計算する方法の詳細をご覧ください。

関連情報