如何在 ls 和 grep 结果上使用 djvubind?

如何在 ls 和 grep 结果上使用 djvubind?

我如何仅 djvubind 中的文件ls | grep -P "page\\d\\d\\d.tif"

答案1

匆忙的读者可以跳到把所有东西放在一起并只阅读该部分——但对于刚接触该主题的用户,我建议从头开始。

基本原则

正在运行djvubind,因此它仅使用名为(其中每个pageNNN.tifN是某个数字)在某种程度上比你想象的要复杂得多,而从另一种意义上来说又稍微简单一些。

  • 仅将所需文件的名称传递.tifdjvubind命令是行不通的, 因为djvubind采取目录作为其论据,并坚持尝试使用该目录中直接包含的所有文件。

    解决这个问题的一种方法是建立另一个目录硬链接指向你开始的目录中的文件,djvubind运行目录,然后(可选)将其删除。我将在此答案中介绍该方法。

    通常来说,对于这种事情,符号链接比硬链接更受欢迎。但是,djvubind它显然会自动跳过符号链接,拒绝处理它们指向的文件。(似乎没有任何选项可以改变这种行为,但如果有人知道方法,我——或者他们——可以编辑这个答案。)

  • 但它不太复杂,因为你不需要调用ls甚至grep

    除了少数情况,比如唯一的目标是向用户显示目录列表,通常最好避免解析lsgrep。虽然可以用于此目的,但您的方法的缺点是选择了一些名称完全不同的文件,例如rampage999.tiffany's.revenge.mp3。(您可以通过以下方式修复此问题:传递grep旗帜-x,但实际上你根本不需要这样做grep。)

选择所需文件

有两种特别流行的方法可以选择与特定模式匹配的文件:

  1. shell 通配符for 循环
  2. 命令find(哪个接受类似的通配符语法

我将在本指南中使用第一种方式,并在最后展示第二种方式的命令。

首先,我建议编写并尝试一个命令,仅显示我们要操作的文件的名称。这是为了避免错误——您将看到是否正确选择了文件。为此,您可以对每个文件运行。(对于真实的东西,您将用不同的命令替换。)printf '%s\n' filenameprintf '%s\n'

for x in page[0-9][0-9][0-9].tif; do printf '%s\n' "$x"; done

请注意,glob( page[0-9][0-9][0-9].tif) 是联合国引用,因为 shell 必须展开它,然后循环遍历展开的列表。(测试将看起来类似这样的,但如果文件较多,输出会更长。您应该能够看到如何只选择正确的文件。)

把所有东西放在一起

现在开始真正做事。创建一个目录来存储硬链接:

mkdir page-links

使用所需文件的硬链接填充新目录:

for x in page[0-9][0-9][0-9].tif; do ln "$x" "page-links/$x"; done

djvubind在新填充的目录上运行page-links

djvubind page-links

(可选)删除硬链接目录:

rm -r page-links

它看起来类似这样的

如果你更喜欢find...

要使用find而不是 shell 通配符和 for 循环:

  • 用于-mindepth 1防止包含目录被视为可能的匹配,
  • 使用-maxdepth 1,以便只匹配当前目录中直接包含的文件(而不是其子目录中的文件),并且
  • 引用该模式,因为它必须由 shell 未扩展地传递给find命令(然后执行匹配)。

列出文件:

find . -mindepth 1 -maxdepth 1 -name 'page[0-9][0-9][0-9].tif'

如果不指定任何操作,则使用默认-print操作,列出您选择的文件。结果前面会显示./,但这不会造成任何问题。

创建目标目录 ( mkdir page-links) 后,填充它:

find . -mindepth 1 -maxdepth 1 -name 'page[0-9][0-9][0-9].tif' -exec ln {} page-links/{} \;

你不必引用{},尽管有些人喜欢这样做,因为它向人们表明它不是括号扩展,并且当从某些非 Bourne 风格的 shell 调用时,如果它们使用不同的括号扩展语法,则可能需要这样做find。请注意,无论您是否引用它,其find行为都会相同--包括对于名称中带有空格的文件. (find永远看不到引号,因为它们是被 shell 移除在运行之前find。误解引用与的操作将文件名传递给命令的{}方式有关,这就是我不引用它的原因。)find-exec

此后,运行djvubind(以及page-links随后可选择删除目录)当然会以完全相同的方式进行。

相关内容