Конвертировать все файлы с указанным расширением в каталоге в pdf, рекурсивно для всех подкаталогов - PullRequest
0 голосов
/ 11 февраля 2019

Я использую следующий код (из этого ответа ) для преобразования всех файлов CPP в текущем каталоге в файл с именем code.pdf, и он хорошо работает:

find . -name "*.cpp" -print0 | xargs -0 enscript -Ecpp -MLetter -fCourier8 -o - | ps2pdf - code.pdf

Я хотел бы улучшить этот скрипт до:

  1. Сделать его .sh-файлом, который может принимать аргумент, указывающий расширение, вместо того, чтобы жестко кодировать его в CPP;

  2. Пусть он запускается рекурсивно, посещая все подкаталоги текущего каталога;

  3. Для каждого обнаруженного подкаталога преобразуйте все файлы указанного расширения в один PDF-файл с именем $ NameOfDirectory $ .PDF и помещается в этот подкаталог;

Ответы [ 2 ]

0 голосов
/ 11 февраля 2019

Во-первых, если я правильно понимаю, это требование:

Для каждого обнаруженного подкаталога преобразуйте все файлы с указанным расширением в один PDF-файл с именем $ NameOfDirectory $ .PDF

неразумно.Если это означает, скажем, что a/b/c/*.cpp записывается в ./c.pdf, то вы облажались, если у вас также есть a/d/x/c/*.cpp, поскольку содержимое обоих каталогов отображается в один и тот же PDF.Это также означает, что *.cpp (то есть файлы CPP в current dir) записывается в файл с именем ./..pdf.

Что-то вроде этого, который называет PDF в соответствии с желаемымрасширение и помещает его в каждый подкаталог вместе с его исходными файлами, не имеет таких проблем:

#!/usr/bin/env bash
# USAGE: ext2pdf [<ext> [<root_dir>]]
# DEFAULTS: <ext> = cpp
#           <root_dir> = .
ext="${1:-cpp}"
rootdir="${2:-.}"

shopt -s nullglob

find "$rootdir" -type d | while read d; do

  # With "nullglob", this loop only runs if any $d/*.$ext files exist
  for f in "$d"/*.${ext}; do

    out="$d/$ext".pdf
    # NOTE: Uncomment the following line instead if you want to risk name collisions
    #out="${rootdir}/$(basename "$d")".pdf

    enscript -Ecpp -MLetter -fCourier8 -o - "$d"/*.${ext} | ps2pdf - "$out"

    break   # We only want this to run once

  done

done
0 голосов
/ 11 февраля 2019

Во-первых, если я правильно понимаю, то, что вы используете, на самом деле неправильно - find будет извлекать файлы из всех подкаталогов.Чтобы работать рекурсивно, нужно только получать файлы из текущего каталога (я назвал его do.bash):

#!/bin/bash

ext=$1
if ls *.$ext &> /dev/null; then
    enscript -Ecpp -MLetter -fCourier8 -o - *.$ext | ps2pdf - $(basename $(pwd)).pdf
fi
for subdir in */; do
    if [ "$subdir" == "*/" ]; then break; fi
    cd $subdir
    /path/to/do.bash $ext
    cd ../
done

Проверка заключается в том, чтобы убедиться, что файл с расширением или подкаталогом действительно существует.Этот сценарий работает с текущим каталогом и вызывает себя рекурсивно - если вы не хотите указывать полный путь, поместите его в списки PATH, хотя полный путь подходит.

...