使用AWK输出的Linux CP

我一直在努力学习更多关于Linux的知识,并且今天早上专注于awk命令。 我一直在努力的命令是在下面。

ls -lRt lpftp.* | awk '{print $7, $9}' | mkdir -p $(awk '{print $1}') | ls -lRt lpftp.* | cp $(awk '{print $9, $7}') 

本质上,我试图将目录中的每个文件移动到基​​于上次修改date的文件的子目录中。 该命令首先仅打印我想要的文件,然后使用mkdir根据上次修改月份的当天创build文件夹。 之后我想要做的是将每个文件移动到其关联的目录中,但是现在该命令将每个文件移动到01文件夹中并打印出以下文本

 cp: 0653-436 12 is a directory. Specify -r or -R to copy. 

每个目录一次。

有谁知道我可以解决这个问题? 或者如果有更好的方法去解决呢?

ls -lRt lpftp.* | awk '{print $7, $9}' | while read day file ; do mkdir -p "$day"; cp "$file" "$day"; done

dodone之间的命令将针对每行输出执行, awk的第一件事是在day变量中打印,第二件在file (每行)打印。 我在这里用了一些不必要的引用,因为变量中不会有空格,因为它们的设置方法不同。

最安全的做法就是在数据上使用awk来输出一个shell脚本。 在awk中,打印你期望执行的mkdircp命令。 把结果输入 (1),直到你满意为止。 (1)也许看整个事情。 然后执行如下:

 ls -lRg lpfpt.* | awk script.awk | sh -ex 

这将回显标准错误的命令,并停在第一个错误。 如果你绝对确定它是正确的,请删除x选项。

这种方法在awk(使用system函数)中的一个循环或一堆子进程的优点是:

  • 你可以看到会发生什么,发生了什么事情
  • 执行速度