我一直在努力学习更多关于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
do
和done
之间的命令将针对每行输出执行, awk
的第一件事是在day
变量中打印,第二件在file
(每行)打印。 我在这里用了一些不必要的引用,因为变量中不会有空格,因为它们的设置方法不同。
最安全的做法就是在数据上使用awk来输出一个shell脚本。 在awk中,打印你期望执行的mkdir
和cp
命令。 把结果输入头 (1),直到你满意为止。 (1)也许看整个事情。 然后执行如下:
ls -lRg lpfpt.* | awk script.awk | sh -ex
这将回显标准错误的命令,并停在第一个错误。 如果你绝对确定它是正确的,请删除x
选项。
这种方法在awk(使用system
函数)中的一个循环或一堆子进程的优点是: