我有一个仅包含文件名的文本文件(不包含其路径)。我需要找到可能位于任何子文件夹中的这些文件,然后将它们复制或移动到其他位置。为了找到这些文件,我尝试了
cat 1.txt | xargs 查找 -iname
xargs 查找 -iname < 1.txt
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