使用 CLI 按日期将文件移动到不同的目录中

使用 CLI 按日期将文件移动到不同的目录中

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

答案1

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

答案2

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

  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

答案3

我想这个问题可能和你的很相似,你也可以看看:创建子目录并按日期组织文件

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

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

答案4

您可能应该使用批处理工具来进行批处理操作。这样做通常需要读取/写入单个流中的所有记录,而不是cp为每个复制的文件调用单独的进程。

这里已经cpio写了一个答案,仅考虑到已经为您提供的选项,我可能会选择这个答案。然而,自其鼎盛时期以来,该cpio格式已得到改进并合并为标准化pax存档格式。也是如此tar

严格的 POSIX-pax不太可能提供任何根据文件修改时间直接过滤存档成员的选项 - 尽管该标准确实指定了%T列表模式格式修饰符。尽管如此,pax据我所知,最常用的实现是由以下人员维护的 BSD 版本米拉比洛斯- 确实将其扩展为可直接访问的 CLI 交换机。

例如,要仅复制./以上次修改为根的树中的所有文件ccyymmddHHMM,您/target/dir可以执行以下操作:

pax -rwT,201301010000 ./ /target/dir

为了避免递归到子目录,您可以这样做:

pax -rwdT,201301010000 ./* /target/dir

请参阅man页面了解更多。

相关内容