在bash中使用cp来管理有关文件的信息,例如修改日期

时间:2014-05-17 00:18:49

标签: bash

我正在尝试从某个修改日期范围将文件从一个目录复制到另一个目录。例如,将5月10日之后创建的所有文件从dir1复制到dir2。我尝试了一些事情,但到目前为止都没有成功。

这对我来说很有意义,但是cp不会将文件名传递给它,而只是执行./*并复制目录中的所有文件:

find . -type f -daystart -mtime 2 | cp ./* /dir/

这几乎可以工作,但没有复制所有匹配文件,我也试过xargs -s 50000,但没有用:

find . -type f -daystart -mtime 2 | xargs -I {} cp {} /dir/

find . -type f -daystart -mtime 2 | xargs cp -t /dir/

在网上找到这个,不起作用:

cp $(find . -type f -daystart -mtime 2) /dir/

想法?感谢。

3 个答案:

答案 0 :(得分:1)

鉴于您的实际问题是关于使用stdin中的文件名而不是stdin中的元数据,这非常简单:

while IFS= read -r -d '' filename; do
  cp "$filename" /wherever
done < <(find . -type f -daystart -mtime 2 -print0)

请注意使用IFS= read -r -d ''-print0 - 作为NUL和/是唯一不能在UNIX文件名中使用的两个字符,使用任何其他字符,包括换行符,划分它们是不安全的。想想如果有人(或软件bug)创建了一个名为$'./ \n/etc/passwd'的文件会发生什么;你想要确定你的脚本在尝试删除或覆盖该文件时,没有任何脚本试图删除或覆盖/etc/passwd


那就是说,你根本不需要使用烟斗:

find . -type f -daystart -mtime -2 -exec cp '{}' /wherever ';'

...或者,如果您只是尝试支持GNU cp,则可以使用这种更有效的变体:

find . -type f -daystart -mtime -2 -exec cp -t /wherever '{}' +

答案 1 :(得分:0)

您没有指定各种尝试不起作用的原因,因此我只能假设它们是文件名中空格的结果。

尝试使用find有用的-exec操作,而不是使用xargs

find . -type f -daystart -mtime 2 -exec cp {} /media/alex/Extra/Music/watchfolder/ \;

答案 2 :(得分:0)

find . -type f -daystart -mtime 2 \
| cpio -pdv /media/alex/Extra/Music/watchfolder/