使用 linux 中特定内容行的名称批量重命名 pdf 文件

bulk rename pdf files with name from specific line of its content in linux

我有多个 pdf 文件要重命名。新名称应该取自 pdf 文件的特定(比如说第 5 行)内容。例如,如果文件的第 5 行包含内容 some string <-- 此字符串应为文件名。其余文件也一样。每个文件都应该用内容的第 5 行重命名。我在终端

试过这个
for pdf in *.pdf
do
   filename=`basename -s .pdf "${pdf}"`
   newname=`awk 'NR==5' "${filename}.pdf"`
   mv "${pdf}" "${newname}"
done

它复制文件,但名称是无效字符串。我知道系统不会将文件视为纯文本和图像,有元数据、xml 标签等等。但是有没有办法从该行获取内容?

开箱即用,bash 及其常用实用程序无法读取 pdf 文件。但是,less 能够从 pdf 文件中恢复文本。您可以按如下方式更改脚本:

for pdf in *.pdf
do
    mv "$pdf" "$(less $pdf | sed '5q;d').pdf"
done

解释:

  • less "$pdf" : 显示pdf文件的文本部分。将考虑间距
    • 进行一些测试以查看是否 less returns 所需的输出
  • sed '5q;d' : 提取输入文件的第5行

您可以选择使用以下脚本删除空行和超出的空格:

mv "$pdf" "$(less "$pdf" | sed -e '/^\s*$/d' -e 's/ \+/ /g' | sed '5q;d').pdf"