如何在linux系统中查找多个文件

Fly*_*Cat 3 linux command-line find-in-files

我的系统中有大量文件,每个文件都有一个对应的文件名。例如,

test.pdf有一个test-project.zip test2.pdf有一个test2-project.zip

test.pdftest2.pdf是原始文件,test-project.ziptest2-project.zip是由我的脚本生成的。

我需要找出我所有的原始文件是否都与原始文件'filename'-project.zip相对应。

我可以用

find /project/ -name "*.pdf" | wc -l
find /project/ -name "*-project.zip" | wc -l
Run Code Online (Sandbox Code Playgroud)

找出数字是否匹配,但我需要知道哪个文件没有对应的文件。

任何人都可以帮助我吗?非常感谢!

evi*_*oup 5

快速脚本,根据您的需要进行调整:

#!/usr/bin/env bash

find /project/ -name '*.pdf' -print0 | while read -d $'\0' i; do
  if [ ! -e "${i/%.pdf/-project.zip}" ]; then
    echo "${i/%.pdf/-project.zip} doesn't exist!"
  fi
done

exit 0
Run Code Online (Sandbox Code Playgroud)

-d $'\0'将分隔符 for 设置为read空字节,而-print0与 for 等效find,因此这对于名称中带有空格和换行符的文件应该是防弹的(在这种情况下显然无关紧要,但一般来说很有用)。${i/%.pdf/-project.zip}取代了.pdf在可变的末端$i-project.zip。除此之外,这都是标准的 shell 脚本编写的东西。

如果你想进一步缩短它,你也可以使用

[ -e "${i/%.pdf/-project.zip}" ] || echo "${i/%.pdf/-project.zip} doesn't exist!"
Run Code Online (Sandbox Code Playgroud)

...而不是if声明。我认为if如果您使用多个短线(您可以通过使用函数来解决这个问题,但此时与使用if.

假设你有 bash 4+(你可能有;你可以检查bash --version),你可以使用 globstar 选项而不是find

#!/usr/bin/env bash

shopt -s globstar
for f in /project/**/*.pdf; do
  if [ ! -e "${f/%.pdf/-project.zip}" ]; then
    echo "${f/%.pdf/-project.zip} doesn't exist!"
  fi
done

exit 0
Run Code Online (Sandbox Code Playgroud)

这具有纯 bash 的优点,因此它应该更快(不过,至少有数百个文件时才明显如此)。

  • @RichHomolka:**`/bin/sh`** 是 POSIX 的必需品。另一方面,`bash` 是第三方程序,它经常在`/usr/bin`、`/usr/local/bin` 甚至`/usr/pkg/bin` 中。 (3认同)