我有一个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