我有大量来自旧硬盘的图片,我正在尝试整理它们。如果我运行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
如果您想忽略旧磁盘上的新文件,我会这样处理
- 创建一个带有修改日期的临时标记文件,将我想要的文件与我不需要的文件分开
- 将早于标记文件的文件复制到新位置
以下是示例命令,假设您希望在新磁盘中维护旧磁盘中的任何目录层次结构(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
答案3
我想这个问题可能和你的很相似,你也可以看看:创建子目录并按日期组织文件
我根据该问题的第一个答案编写了这个新脚本:
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
答案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
页面了解更多。