首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我如何从源文件列表中迭代,并在我的磁盘驱动器中找到这些文件?我用的是FD和RIPGREP

我如何从源文件列表中迭代,并在我的磁盘驱动器中找到这些文件?我用的是FD和RIPGREP
EN

Stack Overflow用户
提问于 2021-06-23 09:36:45
回答 3查看 307关注 0票数 0

我有一个很长的文件列表存储在一个文本文件中(缺少-files.txt),我想在我的驱动器上找到这些文件。这些文件分散在我的驱动器中的不同文件夹中。我想找到能找到的最接近的东西。

missing-files.txt

代码语言:javascript
复制
wp-content/uploads/2019/07/apple.jpg
wp-content/uploads/2019/08/apricots.jpg
wp-content/uploads/2019/10/avocado.jpg
wp-content/uploads/2020/04/banana.jpg
wp-content/uploads/2020/07/blackberries.jpg
wp-content/uploads/2020/08/blackcurrant.jpg
wp-content/uploads/2021/06/blueberries.jpg
wp-content/uploads/2021/01/breadfruit.jpg
wp-content/uploads/2021/02/cantaloupe.jpg
wp-content/uploads/2021/03/carambola.jpg
....

这里是我的工作bash代码:

代码语言:javascript
复制
while read p;
do
    file="${p##*/}"
    /usr/local/bin/fd "${file}" | /usr/local/bin/rg "${p}" | /usr/bin/head -n 1 >> collected-results.txt
done <missing-files.txt

我的bash代码中发生了什么:

  1. I从文件列表
  2. 中迭代,使用FD (https://github.com/sharkdp/fd)命令在驱动器
  3. 中定位这些文件,然后将其传送到E 117RIPGREP<
  4. >E 218 (https://github.com/BurntSushi/ripgrep),以筛选结果并找到最接近的匹配项。我正在寻找的匹配应该匹配相同的文件和文件夹结构。
  5. 最后将其存储在另一个文本文件中,然后可以在该文件中计算下一步

的列表。

需要帮助的

  1. ,这是最有效的方法吗?我有两千多个文件需要找到。我对其他解决方案持开放态度,这是我刚刚发明的。
  2. 由于某种原因我的代码坏了,它停止了将结果返回到“收集-结果. to”。我的猜测是,它在FD命令之后的第二个管道中的某个地方断了。我没有设置任何条件,以防它遇到错误或者找不到文件,所以很难确定.

附加信息:

我使用的是Mac,运行在Catalina

  • Clearly上,这不是我的专长领域
EN

回答 3

Stack Overflow用户

发布于 2021-06-23 14:08:49

“失踪”听起来好像它们不存在于预期的地方。

你凭什么认为他们会在别的地方?

如果是的话,我会把文件名放在一个list.txt文件中,有足够的最小模式将它们从find输出中挑选出来。

代码语言:javascript
复制
$: cat list.txt
/apple.jpg$
/apricots.jpg$
/avocado.jpg$
/banana.jpg$
/blackberries.jpg$
/blackcurrant.jpg$
/blueberries.jpg$
/breadfruit.jpg$
/cantaloupe.jpg$
/carambola.jpg$

然后搜索整个机器,这要花点时间.

代码语言:javascript
复制
$: find / | grep -f list.txt
/tmp/apricots.jpg
/tmp/blackberries.jpg
/tmp/breadfruit.jpg
/tmp/carambola.jpg

或者如果你想要更长的部分路径,

代码语言:javascript
复制
$: find / | grep -f missing-files.txt

如果这些文件确实存在于系统中,则应该显示到这些文件所在位置的实际路径。

票数 1
EN

Stack Overflow用户

发布于 2021-06-23 10:08:40

,这是最有效的方法吗?

I/O通常是最大的瓶颈。您正在运行一些软件fd,以便一次为一个文件找到一个文件。相反,运行它可以同时找到所有文件-为所有文件执行单个I/O操作。在shell中,您可以这样做:

代码语言:javascript
复制
find . -type f '(' -name "first name" -o -name "other name" -o .... ')'

如何从源文件列表中迭代,并在我的磁盘驱动器上定位这些文件?

使用-path匹配完整路径。首先构建参数,然后调用find

代码语言:javascript
复制
findargs=()
# Read bashfaq/001
while IFS= read -r patt; do
    # I think */ should match anything in front.
    findargs+=(-o -path "*/$patt")
done < <(
    # TODO: escape glob better, not tested
    # see https://pubs.opengroup.org/onlinepubs/009604499/utilities/xcu_chap02.html#tag_02_13
    sed 's/[?*[]/\\&/g' missing-files.txt
)
# remove leading -o
unset findargs[0]
find / -type f '(' "${findargs[@]}" ')'

要研究的主题:var=() - bash数组、< <(...) shell重定向和进程替换以及何时使用它(bashfaq/024)、glob (和参见man 7 glob)和man find

票数 0
EN

Stack Overflow用户

发布于 2021-06-23 10:09:02

根据我的理解,您希望找到与目录结构匹配的所有文件:

代码语言:javascript
复制
path/to/file

因此,它应该返回"/full/path/to/file“和”/ and /full/path/to/file“之类的内容。

使用一个简单的find命令,您可以获得符合此条件的所有文件的列表。

使用find,您可以一次性搜索硬盘,形式如下:

代码语言:javascript
复制
$ find -regex pattern

现在的想法是构建模式,我们可以通过文件missing_files.txt来实现。模式应该类似于.*/\(file1\|file2\|...\|filen\)。因此,我们可以使用以下awk来做到这一点:

代码语言:javascript
复制
$ sed ':a;N;$!ba;s/\n/\|/g' missing_files.txt

所以,现在我们可以像你那样做,但要快一些,方法如下:

代码语言:javascript
复制
pattern="$(sed ':a;N;$!ba;s/\n/\|/g' missing_files.txt)"
pattern=".*/\($pattern\)"
find -regex "$pattern" > file_list.txt

为了查找文件,您现在可以执行以下操作:

代码语言:javascript
复制
grep -F -f missing_files file_list.txt

这将返回所有匹配的情况。如果你只想要第一个案子,

代码语言:javascript
复制
awk '(NR==FNR){a[$0]++;next}{for(i in a) if (!(i in b)) if ($0 ~ i) {print; b[i]}}' missing_files file_list.txt
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68097295

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档