如何从目录和子目录中的txt文件中查找许多文件,然后将所有文件复制到新文件夹

时间:2018-04-30 23:54:34

标签: macos command-line terminal

我找不到有助于解决此问题的帖子:

在Mac终端上我想读取包含文件名的txt文件(example.txt),例如: 20130815 144129 865 000000 0172 0780.bmp 20130815 144221 511 000003 1068 0408.bmp ......还有100多个

我想在某个文件夹/子文件夹(example_folder)中搜索它们。每次查找后,应将文件复制到新文件夹x(new_destination)。

非常感谢您的帮助!

Chers, 沫

2 个答案:

答案 0 :(得分:1)

您可以使用管道命令,其中包含lsgrepxargscp的组合。

所以基本上你开始获取文件列表

ls

然后您使用egrep -egrep -e或其grep Mac用于其终端的任何风格来过滤它们。如果要查找以文本结尾的所有文件,可以使用正则表达式.txt$(这意味着以“.txt”结尾)

ls | egrep -e "yourRegexExpression" 

之后你会得到一个输入流,但cp不能用于输入流,只需要一堆参数,这就是我们使用xargs将其转换为参数的原因。最后一步是将标志-t添加到参数中,以表示下一个参数是目标目录。

ls | egrep -e "yourRegexExpression" | xargs cp -t DIRECTORY

我希望这有帮助!

修改

抱歉,我没有充分阅读这个问题,我更新了以匹配您的问题。在这里,您可以看到egrep命令以这种方式编译包含所有文件名的相当大的正则表达式字符串(filename1|filename2|...|fileN)。 $()计算内部命令并使用tr将newLines转换为“|”为正则表达式。

ls | egrep -e "("$(cat yourtextfile.txt | tr "\n" "|")")" | xargs cp -t DIRECTORY

答案 1 :(得分:1)

您可以执行以下操作:

$ for i in `cat example.txt`
find /search/path -type f -name "$i" -exec cp "{}" /new/path \;

这就是example.txt中每一行的工作方式:

for i in `cat example.txt`

它将尝试在定义的路径中找到与行$i匹配的文件:

find /search/path -type f -name "$i"

如果发现它会将其复制到所需的位置:

-exec cp "{}" /new/path \;