根据包含文件列表的文本文件搜索文件

根据包含文件列表的文本文件搜索文件

我有一个仅包含文件名的文本文件(不包含其路径)。我需要找到可能位于任何子文件夹中的这些文件,然后将它们复制或移动到其他位置。为了找到这些文件,我尝试了

  1. cat 1.txt | xargs 查找 -iname

  2. xargs 查找 -iname < 1.txt

  3. xargs -a 1.txt 查找-iname

但它们返回“ find:路径必须在表达式之前:KUMARI_BRACK.jpg 用法: find [-H] [-L] [-P] [-Olevel] [-D help|tree|search|stat|rates|opt|exec] [path...] [expression] ”。

非常感谢任何建议

答案1

cat 1.txt | xargs -L 1 find /pathname -iname 

应该有帮助。不过,这样做效率不高,因为要对列表中的每个文件再次调用 find。

答案2

更强力的方法可能是

find | egrep -f 1.txt

它将使用 1.txt 文件的内容作为一组要匹配的正则表达式。由于您的文件名中表面上没有任何正则表达式特殊字符(也许除了“。”),因此最终将匹配 find 生成的任何路径与文件名列表。

但是,速度会比较慢,具体取决于 1.txt 中有多少个文件。

更好的方法可能是查看文件的名称,如果可以收集到一些一般特征(例如,它们都以相同的开头,或者具有相似的后缀),则可以使用这些元素进行更好(更严格)的查找。例如,如果文件都以 .txt 结尾,并且归用户 foo 所有,并且只能在 /tmp 中找到,那么

find /tmp -type f -user foo -name \*.txt 

会更有效率,并且还允许您使用 -exec 参数来对它们执行某些操作,假设您只得到了您想要的匹配项。

find /tmp -type f -user foo -name \*.txt -exec mv {} /newdir \;

答案3

您的“查找”选项不正确。“查找”后的第一个参数是搜索的起点。因此,如下所示:

cat 1.txt |xargs find /path/to/files -iname

应该可以。如果您要搜索整个磁盘,则输入“find / -iname”。如果您要从当前工作目录搜索,则输入“find . -iname”。

答案4

$cat list
FILE1
FILE2


$ cat list | tr -s '\n' '#' | sed -e 's/#/$\|\//g' | sed -e 's#|/$##'  |awk '{print "(/"$0")"}'
(/FILE1$|/FILE2$)

上述代码将为下面的 egrep 生成参数,它将一次性过滤出必要的匹配项

$ find /tmp/ | egrep '(/FILE1$|/FILE2$)'
/tmp/test/FILE2
/tmp/test/FILE1

相关内容