2016-11-14 70 views
4

我一直在努力学习更多关于Linux的知识,并且今天早上专注于awk命令。下面是我一直试图开展工作的命令。使用AWK输出的Linux CP

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

本质上我试图将目录中的每个文件移动到基​​于该文件上次修改日期的子目录中。该命令首先仅打印我想要的文件,然后使用mkdir根据上次修改月份的当天创建文件夹。我想以后做的就是每个文件移动到其相关目录,但该指令是现在每个文件移动到01文件夹和每个目录打印出来,一旦下面的文字

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

没有人知道我该如何解决这个问题?或者如果有更好的方法去解决它?

+0

你为什么将'mkdir'的输出传送到'ls'? 'mkdir'不会产生任何输出(除了错误消息)并且'ls'不使用它的输入。 – Barmar

+0

第二个LS语句的原因是因为在mkdir之后,我无法从原始LS访问文件名,所以为了重新创建该列表我再次运行它。有没有更好的方法? – Cronisej

+0

@Cronisej是的,看我的答案。 – eddiem

回答

3

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

dodone之间的命令将用于输出的每一行中day变量和file第二(每行)执行的,与所述第一件事awk打印。我在这里用一些不必要的引号,因为变量中不会有空格,只要给出它们的设置方法。

1

做这样的事情最安全的方法 - 也是最快的执行方式是使用awk来输出一个shell脚本。在awk中,打印您希望执行的命令mkdircp。管理结果到(1),直到你满意。也许看看的整个事情少吧(1)。然后执行如下:

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

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

这种方法在环或AWK一堆子过程(与system功能)的优点是:

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