将循环内 find 命令的输出写入文件

将循环内 find 命令的输出写入文件

我有一个find嵌套在循环中的命令,我想将输出写入文件并能够实时查看它。但到目前为止我尝试过的每一种方法都未能实现这一目标。

我的while命令是这样的:

while read -r LINE; do find "$LINE" -name "*Bop*" ; done < /drives/d/dirs_to_search.txt

当我运行上面的命令时,我可以看到匹配的子目录列表打印到我的终端窗口中。我想要继续查看此比赛列表, 但同时将它们写入文件

到目前为止我尝试过的将输出写入find名为的文件的方法matched_subdirs

while read -r LINE; do find "$LINE" -name "*Bop*" | tee /drives/d/matched_subdirs.txt ; done < /drives/d/dirs_to_search.txt

while read -r LINE; do find "$LINE" -name "*Bop*" ; done < /drives/d/dirs_to_search.txt | tee /drives/d/matched_subdirs.txt

while read -r LINE; do find "$LINE" -name "*Bop*" -print; done < /drives/d/dirs_to_search.txt | tee /drives/d/matched_subdirs.txt

while read -r LINE; do find "$LINE" -name "*Bop*" > /drives/d/matched_subdirs.txt ; done < /drives/d/dirs_to_search.txt

while read -r LINE; do find "$LINE" -name "*Bop*"; done < /drives/d/dirs_to_search.txt > /drives/d/matched_subdirs.txt

答案1

您显示的命令应该,正如特登所说, 工作。

另一种方法可以摆脱tee

rm -f /drives/d/matched_subdirs.txt
while IFS= read -r pathname; do
    find "$pathname" -name '*Bop*' -print \
        -exec sh -c 'printf "%s\n" "$@" >>matched' sh {} +
done <dirlist

这将find打印找到的路径名供您查看,然后使用嵌入的 shell 脚本将它们写入结果文件。

我有点担心你打算如何处理输出文件中的路径名。如果您打算稍后使用它们进行循环,那么最好find直接从内部执行此操作。否则,您可能会遇到包含嵌入换行符的奇怪文件名的问题。


在评论中你说您打算在循环中使用找到的路径名来运行rsync。调用rsync每个路径名将是非常慢,你最好rsync直接这样做:

while IFS= read -r pathname; do
    rsync -avR --include='*/' --include='*Bop*' --exclude='*' --prune-empty-dirs "$pathname" target
done <dirlist

dirlist是一个包含您的目录的文件。

例子:

$ tree
.
|-- dirlist
`-- source
    |-- a
    |   |-- dir-1
    |   |   |-- somefile_Bop_here
    |   |   `-- someotherfile
    |   |-- dir-2
    |   |   |-- somefile_Bop_here
    |   |   `-- someotherfile
    |   `-- dir-3
    |       |-- somefile_Bop_here
    |       `-- someotherfile
    |-- b
    |   |-- dir-1
    |   |   |-- somefile_Bop_here
    |   |   `-- someotherfile
    |   |-- dir-2
    |   |   |-- somefile_Bop_here
    |   |   `-- someotherfile
    |   `-- dir-3
    |       |-- somefile_Bop_here
    |       `-- someotherfile
    `-- c
        |-- dir-1
        |   |-- somefile_Bop_here
        |   `-- someotherfile
        |-- dir-2
        |   |-- somefile_Bop_here
        |   `-- someotherfile
        `-- dir-3
            |-- somefile_Bop_here
            `-- someotherfile

13 directories, 19 files
$ cat dirlist
source/a
source/b/dir-2

(这里运行循环)

$ tree target
target
`-- source
    |-- a
    |   |-- dir-1
    |   |   `-- somefile_Bop_here
    |   |-- dir-2
    |   |   `-- somefile_Bop_here
    |   `-- dir-3
    |       `-- somefile_Bop_here
    `-- b
        `-- dir-2
            `-- somefile_Bop_here

7 directories, 4 files

我选择使用-R( --relative)。没有它,我就会得到

target
|-- a
|   |-- dir-1
|   |   `-- somefile_Bop_here
|   |-- dir-2
|   |   `-- somefile_Bop_here
|   `-- dir-3
|       `-- somefile_Bop_here
`-- dir-2
    `-- somefile_Bop_here

相关内容