根据包含文件列表的文本文件search文件

我有一个文本文件只包含文件名(它不包含它们的path)。 我需要find这些文件可能在任何子文件夹,然后将其复制或移动到其他位置。 find我尝试过的文件

  1. 猫1.txt | xargsfind-iname

  2. xargsfind-iname <1.txt

  3. xargs -a 1.txt find -iname

但是它们返回“find:path必须先于expression:KUMARI_BRACK.jpg用法:find [-H] [-L] [-P] [-Olevel] [-D help | tree | search | stat | rates | opt | exec] [path…] [expression]“。

任何build议,非常感谢

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

应该有帮助。 但是,这并不是非常有效,所以再次查找列表中的每个文件。

更蛮力的方法可能是

 find | egrep -f 1.txt 

这将使用1.txt文件的内容作为一组正则expression式来匹配。 由于表面上你的文件名中没有任何正则expression式的特殊字符(可能除了“。”),这最终将匹配find的文件名列表的任何path。

然而,这取决于你在1.txt中有多less个文件。

一个更好的方法可能是查看文件的名称,如果有一些可以搜集到的一般特征(例如,它们都是相同的,或者具有相似的后缀),则可以使用这些元素来做更好的(更多限制)find。 例如,如果文件全部以.txt结尾,并由用户foo拥有,并且只能在/ tmp中find

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

会更有效率,并且还允许你使用-exec参数来find对他们做些什么,假设你只有你想要的匹配。

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

你有“发现”选项不正确。 “find”之后的第一个参数是search的起点。 所以,像这样的:

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

应该pipe用。 如果你正在search整个磁盘,那么“find / -iname”。 如果您从当前工作目录search,然后“find。-iname”。

这是残酷和低效的,但为我工作(在bash):

 for file in `cat 1.txt` ; do find . -iname $file -print ; done 

如果您只想find与名称匹配的平面文件 (即不是目录,特殊文件等),请更改. -iname . -iname. -type f -iname . -type f -iname

 $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