如何对目录及其中的所有文件使用通配符

如何对目录及其中的所有文件使用通配符

假设我想对目录进行通配符处理,然后对这些目录中的所有文件进行通配符处理。

我该如何做呢?

我知道 * 是对所有文件进行通配符处理,但我不知道如何对目录进行通配符处理。

例如pdf2djvu -o /dir/[wildcard dirs]/[wildcards.djvu] /dir/[wildcard dirs]/[wildcards.pdf]

另外要注意的是,如果位置有一个空格,那么这种通配符是否会受到影响,而通常使用“”输入空格,这次最好使用\?

我尝试了上面发布的内容,使用标准 * 作为通配符目录和通配符文件,/dir[entire dir had no spaces]/*/*.djvu但出现了以下错误

I/O error (basic_ios::clear)

答案1

一种可能的解决方法是使用类似以下的方法:

find . -iname *.pdf | xargs -I% pdf2djvu -o % %.djvu

这将找到从当前目录开始的所有 pdf 文件(递归)并运行 pdf2djvu 命令来生成 file.pdf.djvu 文件。

答案2

问题是没有好的方法让两个通配符扩展保持同步并对它们进行迭代,就像您想要做的那样。由于您只想一次对一个文件执行此操作,因此使用 find 会更容易。如果您想以递归方式执行此操作,我会这样做find . -iname '*.pdf' -exec pdf3djvu -o '{}'.djvu '{}' \; 如果您只想在某些目录中执行此操作,请想出扩展到这些目录的 shell 通配符,并将其用作 find 的参数而不是.。例如,如果您有多个以“djvus”结尾的目录(如“pie_djvus”和“flag_djvus”):

find ./*djvus/ -maxdepth 1 -iname '*.pdf' -exec pdf3djvu -o '{}'.djvu '{}' \;

在 glob 之后使用/可确保 glob 仅匹配目录,并且指定 maxdepth 为 1 可确保 find 不会在指定的目录中深入超过一级(即顶层)

在这两种情况下,您最终都会得到类似“file.pdf.djvu”的内容,这可能会或可能不会让您感到烦恼。因此,如果您使用 find,则需要第二个后处理步骤。如果您使用最近的 bash 作为 shell,这里有一种方法可以做到这一点(某些 shell 会根据空格拆分文件名,这会破坏这一点 - 但当前的 bash 不会)。

for F in *.pdf.djvu; do mv -v "$F" "${F%.pdf.djvu}.djvu"; done

相关内容