如何在 unix 中移动或复制“find”命令列出的文件?
Posted
技术标签:
【中文标题】如何在 unix 中移动或复制“find”命令列出的文件?【英文标题】:How to move or copy files listed by 'find' command in unix? 【发布时间】:2013-06-26 11:20:55 【问题描述】:我有一个使用以下命令看到的某些文件的列表,但是如何将列出的这些文件复制到另一个文件夹中,比如 ~/test?
find . -mtime 1 -exec du -hc +
【问题讨论】:
find . -mtime 1 -exec cp ~/test/ \;
另外,考虑通过管道连接到xargs
。这样就可以批量复制文件了。
嘿,非常感谢你们俩
关于@EricJablow - 你是对的。但是,如果您在语句末尾使用+;
运行-exec
,它将在一个批次中复制,如果您使用\;
,它将为找到的每个文件运行cp
命令。干杯!
Find and copy files的可能重复
【参考方案1】:
添加到 Eric Jablow 的答案,这是一个可能的解决方案(它对我有用 - linux mint 14 /nadia)
find /path/to/search/ -type f -name "glob-to-find-files" | xargs cp -t /target/path/
您也可以参考“How can I use xargs to copy files that have spaces and quotes in their names?”。
【讨论】:
-name
采用全局匹配,而不是正则表达式。一个重要的区别...
在复制大量文件的情况下,看起来 xargs 比 exec 更有效。
Eduardo,如果您进行了任何基准测试,您能分享一下结果吗?【参考方案2】:
其实你可以通过两种方式处理复制命令中的find
命令输出:
如果find
命令的输出不包含任何空格,即如果文件名中不包含空格,那么您可以使用:
Syntax:
find <Path> <Conditions> | xargs cp -t <copy file path>
Example:
find -mtime -1 -type f | xargs cp -t inner/
但是我们的生产数据文件可能包含空格,所以大多数时候这个命令是有效的:
Syntax:
find <path> <condition> -exec cp '' <copy path> \;
Example
find -mtime -1 -type f -exec cp '' inner/ \;
在第二个例子中,最后一部分,分号也被认为是find
命令的一部分,在按Enter之前应该转义。否则你会得到类似这样的错误:
find: missing argument to `-exec'
【讨论】:
如果没有找到文件,则 cp 将抛出错误:cp: missing file operand
。如何忽略这个?【参考方案3】:
find /PATH/TO/YOUR/FILES -name NAME.EXT -exec cp -rfp /DST_DIR \;
【讨论】:
如果你想在当前目录中搜索,很酷的事情,你不必指定路径,只需使用点 (.) find 。 -name NAME.EXT -exec cp -rfp /DST_DIR \;【参考方案4】:如果您使用的是 GNU 查找,
find . -mtime 1 -exec cp -t ~/test/ +
这与将输出通过管道传输到 xargs
一样有效,同时避免了这样做的缺陷(它可以处理嵌入的空格和换行符,而无需使用 find ... -print0 | xargs -0 ...
)。
【讨论】:
【参考方案5】:这对我来说是最好的方式:
cat filename.tsv |
while read FILENAME
do
sudo find /PATH_FROM/ -name "$FILENAME" -maxdepth 4 -exec cp '' /PATH_TO/ \; ;
done
【讨论】:
以上是关于如何在 unix 中移动或复制“find”命令列出的文件?的主要内容,如果未能解决你的问题,请参考以下文章
UNIX命令,统计当前目录(含子目录)下所有后缀为.log的文件中ERROR出现的行数