在shell中复制之前过滤

时间:2014-11-04 12:55:34

标签: bash shell filter copy cp

我有一个包含2014年1月到2014年11月文件的目录。遗憾的是,这些文件的名称中没有日期,所以我唯一能够知道该文件属于哪个月的方法是使用ls -lrt并检查那个月。

所以我必须根据创建文件的月份将这些文件复制到另一个位置。

ls -lrt | grep Oct

会给我所有的Oct文件。

现在,我试过

ls -lrt | grep Oct | cp * /../../oct2014

这显然不起作用。无论如何我可以执行这样的任务吗?

编辑:非常感谢大家回复这么好的答案并附上解释。我真的很谦卑。我明天早上会试试这些。

此外,我正在处理的所有文件的名称中都没有任何特殊字符。再次感谢。

3 个答案:

答案 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是您要将文件复制到

的目标文件夹