如何忽略重定向文件列表输出的文件名?

如何忽略重定向文件列表输出的文件名?

当我使用命令查找目录及其子目录中的所有文件并将输出重定向到文件 result.txt 时,然后在 result.txt 文件中我将获取包括 result.txt 在内的所有文件,但我没有想要结果.txt。

就像我正在做的那样

find . -type f > allfiles.txt

结果我得到的是

./test1/test3/file4
./test1/file3
./test2/test4/file6
./test2/file5
./allfiles.txt

如何避免这种情况?

答案1

具体来说find,您可以这样做:

find . ! -path ./allfiles.txt -type f > allfiles.txt

更一般地,您可以使用 moreutils 命令延迟输出文件的创建,直到命令返回之后sponge

ls -lRA | sponge allfiles.txt

但这确实意味着将整个输出存储在内存中。

如果未安装 moreutils(通常不是默认安装),您可以实现sponge为:

sponge() {
  perl -0777 -e '$text=<STDIN>;
                 open STDOUT, ">", shift or die$!;
                 print $text' -- "$@"
}

答案2

简而言之,不要将 allfiles.txt 文件放入正在运行 find 的同一目录中。把它放在其他地方,比如:

find . -type f > /tmp/allfiles.txt

或者,如果它必须位于同一目录中,请使用 grep 对其进行过滤:

find . -type f | grep -vxF ./allfiles.txt > allfiles.txt

(假设没有其他文件被./foo\n./allfiles.txt调用)

相关内容