我有一个包含2014年1月到2014年11月文件的目录。遗憾的是,这些文件的名称中没有日期,所以我唯一能够知道该文件属于哪个月的方法是使用ls -lrt
并检查那个月。
所以我必须根据创建文件的月份将这些文件复制到另一个位置。
ls -lrt | grep Oct
会给我所有的Oct文件。
现在,我试过
ls -lrt | grep Oct | cp * /../../oct2014
这显然不起作用。无论如何我可以执行这样的任务吗?
编辑:非常感谢大家回复这么好的答案并附上解释。我真的很谦卑。我明天早上会试试这些。
此外,我正在处理的所有文件的名称中都没有任何特殊字符。再次感谢。
答案 0 :(得分:1)
这是一种方式
ls -ltr | awk '/Oct/{print $NF}' | xargs -i{} cp {} Newdir
或者您可以使用find
find . -type f -newermt "Oct 01" ! -newermt "Oct 31" | xargs -i{} cp {} Newdir
更强大的发现(归功于BroSlow)
find . -type f -newermt "Oct 01" ! -newermt "Oct 31 23:59:59" -print0 | xargs -0 -i{} cp {} Newdir
如果你需要它是世界上最准确的东西
find . -type f -newermt "Oct 01" ! -newermt "Oct 31 23:59:59.9999999999999999999999999999999999999999999999999999999999999" -print0 | xargs -0 -i{} cp {} Newdir
我想补充一点,虽然在某些情况下解析ls是不安全的(因为它不能很好地显示特殊字符,并且大多数程序通过空格和换行符终止参数),如果你知道所有文件名都在目标文件夹是没有特殊字符或空格的常规名称,然后解析ls
将完全正常
。
显然,文件的名称由用户自行决定,因此在大多数情况下,名称可以更改,最好使用find
解决方案。
答案 1 :(得分:1)
您应该避免在以后或者遇到问题时解析ls
输出。
考虑这个find
+ stat
命令:
find . -maxdepth 1 -type f -exec bash -c 'f="$1"; ts=$(stat -c '%Y' "$f"); \
m=$(date -d "@$ts" "+%b"); mkdir -p "$m" && echo mv "$f" "$m"' - {} \;
一旦您对输出感到满意,从命令中删除echo
,因为我出于安全原因故意使用它。
find . -maxdepth 1 -type f
- 将查找当前目录中的所有文件-exec bash -c
- 将为每个文件执行bash命令行stat -c '%Y' "$f"
- 将在每个文件的EPOCH值中找到最后修改时间date -d "@$ts" "+%b"
- 将EPOCH值转换为月份名称mkdir -p "$m"
- 将创建一个月份名称为mv
命令会将所有文件移动到相应的月份目录答案 2 :(得分:0)
试试这个:
cp $(ls -l --full-time | grep '2014-10' | awk '{print $NF}') myfolder --you could do it with find command as well
cp - 复制
ls -l --full-time - 长年上市,以及年份
grep搜索年月份
awk - 只打印最后一列值,即文件名
myfolder是您要将文件复制到