我一直在努力学习更多关于Linux的知识,并且今天早上专注于awk命令。我一直试图开始工作的命令如下。
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 :(得分:3)
ls -lRt lpftp.* | awk '{print $7, $9}' | while read day file ; do mkdir -p "$day"; cp "$file" "$day"; done
do
和done
之间的命令将针对每行输出执行,第一件事awk
打印在day
变量中,第二件打印在file
中1}}(每行)。我在这里使用引号有点不必要,因为变量中没有空格给定它们设置的方法。
答案 1 :(得分:1)
执行此类操作的最安全方法 - 并且执行速度最快 - 是使用awk对数据输出shell脚本。在awk中,打印您希望执行的mkdir
和cp
命令。将结果导入 head (1),直到您满意为止。也许在 less (1)中查看整个事情。然后按如下方式执行:
ls -lRg lpfpt.* | awk script.awk | sh -ex
这会将命令回显到标准错误,并在第一个错误时停止。如果您非常确定它是正确的,请删除x
选项。
这种方法相对于awk中的循环或一堆子进程(使用system
函数)的优点是: