同じ名前のファイルをマージするシェルスクリプト

同じ名前のファイルをマージするシェルスクリプト

次のファイルディレクトリがあります。

file.1111111_1.pdf
file.1111111_2.pdf
file.2222222_1.pdf
file.2222222_2.pdf
file.1234567_1.pdf
file.1234567_2.pdf
file.aaaaaaa_1.pdf
file.aaaaaaa_2.pdf
file.abcdefg_1.pdf
file.abcdefg_2.pdf

同じファイル名の最初の7桁を同じディレクトリまたはサブディレクトリの新しいファイルにマージするにはどうすればよいですか?次のようにしてください。

file.1111111.pdf
file.2222222.pdf
file.1234567.pdf
file.aaaaaaa.pdf
file.abcdefg.pdf

答え1

PDFファイルをマージするにはいくつかのツールがあり、そのうちの1つはですpdfunite。このツールを使用して必要なタスクを実行する簡単な1行のコードは次のとおりです。

for file in file.*_*.pdf; do [[ -e ${file%_*}.pdf ]] && \
    continue || pdfunite ${file%_*}_*.pdf ${file%_*}.pdf; done

私はここで使います。パラメータ拡張メカニズム ${file%_*}一致するファイル名からサフィックスパターンを削除し、出力ファイルに_*します。${file%_*}.pdf

答え2

以下は、「convert」コマンドを使用する簡単な例です。

$ ls
files.txt  TEST.pdf

TEST.pdf次のウェブサイトから入手したAdobe PDFです。ここ。これは、残りのファイル名を埋めるために使用する例です。

ファイル名は次のとおりです。files.txt

$ cat files.txt 
file.1111111_1.pdf file.1111111_2.pdf file.2222222_1.pdf file.2222222_2.pdf file.1234567_1.pdf file.1234567_2.pdf file.aaaaaaa_1.pdf file.aaaaaaa_2.pdf file.abcdefg_1.pdf file.abcdefg_2.pdf

このファイルを使用してテストデータを生成します。

$ for i in $(<files.txt); do cp TEST.pdf $i; done

$ ls
file.1111111_1.pdf  file.1234567_1.pdf  file.2222222_1.pdf  file.aaaaaaa_1.pdf  file.abcdefg_1.pdf  files.txt
file.1111111_2.pdf  file.1234567_2.pdf  file.2222222_2.pdf  file.aaaaaaa_2.pdf  file.abcdefg_2.pdf  TEST.pdf

これで、名前構造に一致するすべてのファイルを繰り返すことができます。次に、適切なサブディレクトリに配置します。その後、「変換」コマンドを使用してこれらのPDFを単一のファイルにマージしました。

$ for pdf in $(ls *.*_*.pdf); do base=$(echo $pdf | cut -d_ -f1) ; \
    [[ -d $base ]] || mkdir $base ; mv $pdf $base/ ; \
    convert $base/*_*.pdf $base/$base.pdf ; done

$ ls
file.1111111  file.1234567  file.2222222  file.aaaaaaa  file.abcdefg  files.txt  TEST.pdf

$ ls file.1111111/ 
file.1111111_1.pdf  file.1111111_2.pdf  file.1111111.pdf

file.11111111.pdfサブディレクトリにはマージされたファイルがあります。

関連情報