将目录中指定扩展名的所有文件转换为pdf,对于所有子目录,递归



我使用以下代码(来自此答案(将当前目录中的所有 CPP 文件转换为名为 code 的文件.pdf并且效果很好:

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

我想改进此脚本以:

  1. 使其成为一个.sh文件,该文件可以采用指定扩展,而不是将其硬编码为 CPP;

  2. 让它递归运行,访问当前目录的所有子目录;

  3. 对于遇到的每个子目录,将指定扩展名的所有文件转换为名为 $NameOfDirectory$.PDF 并放置在该子目录中的单个 PDF;

首先,如果我理解正确,这个要求:

对于遇到的每个子目录,将指定扩展名的所有文件转换为名为 $NameOfDirectory$.PDF 的单个 PDF

是不明智的。如果这意味着,比如说,a/b/c/*.cpp被脚本化为./c.pdf,那么你也有a/d/x/c/*.cpp,你就完蛋了,因为两个目录的内容都映射到同一个PDF。这也意味着*.cpp(.CPP即当前目录中的文件(被脚本化为名为 ./..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

首先,如果我理解正确,您使用的内容实际上是错误的 - 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 列表中,尽管完整路径很好。

相关内容

  • 没有找到相关文章

最新更新