使用CLI按日期将文件移动到其他目录


9

我要整理的旧硬盘中有大量图片。如果运行ls -l,我注意到所有这些文件的创建日期均为2012年或更早。理想情况下,我想将它们移动到计算机的第二个硬盘驱动器,该硬盘驱动器未设置为自动安装。最好,我可以将某些命令链接在一起,以批处理方式完成所有这些工作。到目前为止,我ls -l | grep -i 2012只在所提供的日期中吐出了2012年的文件ls -l。现在,诀窍是将cp所有这些文件都移到新目录中。我不确定下一步该怎么做,因为每个文件都必须复制。下一组命令是什么?

Answers:


13

不要使用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 

1
不会`-exec mv {} / your / target / directory \;' 而不是'-print 0 | xargs -0 cp -t / your / target / directory'在名称空间问题上也一样好吗?(此外,OP希望不复制动议
哈根·冯·埃岑

^^是的。两者都达到了相同的目的。
shivams 2015年

4

如果您要忽略旧磁盘上的新文件,我会这样处理

  1. 创建一个带有修改日期的临时标记文件,该文件将我想要的文件与我不需要的文件分开
  2. 将比标记文件更旧的文件复制到新位置

这是用于此目的的示例命令,假定您要维护新磁盘中旧磁盘的任何目录层次结构(cpio是复制命令,类似于tarpax):

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

2

我认为也许这个问题与您的非常相似,您也可以查看以下内容:创建子目录并按日期组织文件

我根据该问题的第一个答案编写了这个新脚本:

for x in *; do
  d=$(date -r "$x" +%Y)
  mkdir -p "/your/new/directory/$d"
  mv -- "$x" "/your/new/directory/$d/"
done
  1. 将此脚本写到copy.sh旧目录中命名的文件中。

  2. /your/new/directory新目录的路径替换

  3. 使该文件可执行 chmod +x copy.sh

  4. 然后执行该文件 ./copy.sh


1
您可能需要添加一些异常处理,因此脚本不会将自身移至2015目录中。
G-Man说'恢复莫妮卡'

1

您可能应该使用批处理工具进行批处理操作。这样做通常需要在单个流中读取/写入所有记录,而不是例如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,但tarcpio仍然站在我很好。+1
roaima 2015年

@roaima-严格来说,虽然存在实际的pax存档格式(这是ustar格式的扩展),但是POSIX规范的pax 实用程序读取/写入cpio,pax和ustar格式。因为这三种存档类型主要只是将许多文件的元数据与所述文件的实际数据一起编码到单个流中的编码方式不同,所以实际上并不过分。我曾经写过shitar-这是shell脚本的只是几行-主要是dd- tar在基于POSIX规范飞荷兰国际集团块开发者。
mikeserv

我喜欢您的链接脚本;奇怪的是,几个月前,出于完全相同的目的,它本来会非常有用。那好吧。我什至可能尝试停止使用cpio -H ustar...
roaima 2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.