Answers:
不要使用ls
。不建议在这种情况下使用。而且,使用grep
按日期过滤不是一个好主意。您的文件名本身可能包含2012
字符串,即使在2012年未进行修改。
使用find
命令并通过管道传递其输出。
find . -newermt 20120101 -not -newermt 20130101 -print0 | xargs -0 cp -t /your/target/directory
这里,
-newermt 20120101 ==> File's modified date should be newer than 01 Jan 2012
-not ==> reverses the following condition. Hence file should be older than 01 Jan 2013
-print0 and -0 ==> Use this options so that the command doesn't fail when filenames contain spaces
如果您要忽略旧磁盘上的新文件,我会这样处理
这是用于此目的的示例命令,假定您要维护新磁盘中旧磁盘的任何目录层次结构(cpio
是复制命令,类似于tar
或pax
):
touch -t 201201010000 /tmp/marker # YYYYMMDDhhmm == Jan 1st, 2012
cd /path/to/old/disk
find . -type f \! -newer /tmp/marker -print0 | cpio -pmd0 /path/to/new/disk
我认为也许这个问题与您的非常相似,您也可以查看以下内容:创建子目录并按日期组织文件
我根据该问题的第一个答案编写了这个新脚本:
for x in *; do
d=$(date -r "$x" +%Y)
mkdir -p "/your/new/directory/$d"
mv -- "$x" "/your/new/directory/$d/"
done
将此脚本写到copy.sh
旧目录中命名的文件中。
用/your/new/directory
新目录的路径替换
使该文件可执行 chmod +x copy.sh
然后执行该文件 ./copy.sh
2015
目录中。
您可能应该使用批处理工具进行批处理操作。这样做通常需要在单个流中读取/写入所有记录,而不是例如cp
为每个复制的文件调用单独的过程。
cpio
此处已经有一个答案,如果仅提供了已提供的选项,则可能是我会选择的答案。但是,自鼎盛时期以来,该cpio
格式已得到改进并折叠成标准pax
存档格式。的情况也是如此tar
。
pax
尽管标准确实指定了%T
列表模式format-modifier,但严格的POSIX- 不可能提供任何选项来基于文件修改时间直接过滤存档成员。不过,pax
我所知道的最常用的实现-这是mirabilos维护的BSD版本-确实将其扩展为可直接访问的CLI开关。
例如,只有所有文件复制在根的树./
这是最后一次修改之前ccyymmddHHMM
给/target/dir
你可以这样做:
pax -rwT,201301010000 ./ /target/dir
为了避免递归到子目录,您可以执行以下操作:
pax -rwdT,201301010000 ./* /target/dir
有关man
更多信息,请参见页面。
pax
,但tar
并cpio
仍然站在我很好。+1
cpio -H ustar
...