根据另一个文件的存在从 UNIX“查找”结果中排除某个文件

根据另一个文件的存在从 UNIX“查找”结果中排除某个文件

我有一大堆目录,每个目录都有一系列 .pdf 文件。其中一些文件已成功转换为 .csv,有些则没有。使用的示例目录列表find ./

./test5.pdf.csv
./test6.pdf
./test1.pdf.csv
./test3.pdf
./test1.pdf
./test3.pdf.csv
./test4.pdf.csv
./test7.pdf
./test2.pdf
./test5.pdf
./test4.pdf
./test2.pdf.csv
./test8.pdf

我如何返回具有不是转换成功?

换句话说,哪些文件没有 .csv.pdf 对应文件?

在这个例子中,它将是 test{6,7,8}.pdf。

答案1

以下是 find 的工作原理:

find . -name "*.pdf" | while read F; do test -f "${F}.csv" || echo "$F"; done

与 shell 通配符相比,使用 find 更可取,因为它对参数的数量没有限制,并且可以处理空格和特殊字符。

答案2

我找不到find直接做到这一点的方法,但使用 for 循环非常容易:

for file in *.pdf; do [ -f ${file}.csv ] || echo $file; done

如果您需要在顶级目录中运行它并让它递归,您可以像这样使用 find:

for file in $(find . -iname '*.pdf'); do [ -f ${file}.csv ] || echo $file; done

输出内容如下:

./dir2/test7.pdf
./dir2/test6.pdf
./dir2/test8.pdf
./dir3/test7.pdf
./dir3/test6.pdf
./dir3/test8.pdf
./dir1/test7.pdf
./dir1/test6.pdf
./dir1/test8.pdf

不过,最后一个要小心,如果你不确定输入文件名中不会有任何奇怪的字符,请确保设置独立财务顾问相应的环境变量:

OFS=$IFS
export IFS=$'\n'

当然,从现在开始情况只会变得更加糟糕。

我假设您使用 bash。

相关内容