Linux CP 使用 AWK 输出

Linux CP using AWK output

我一直在努力学习更多关于 Linux 的知识,并且今天上午一直专注于 awk 命令。下面是我一直试图开始工作的命令。

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

本质上,我试图根据该文件的最后修改日期将目录中的每个文件移动到子目录中。该命令首先只打印我想要的文件,然后使用 mkdir 根据上次修改的日期创建一个文件夹。之后我想做的是将每个文件移动到其关联的目录中,但是现在的命令是将每个文件移动到 01 文件夹中并打印出以下文本

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

每个目录一次。

有谁知道我该如何解决这个问题?或者是否有更好的方法?

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

dodone 之间的命令将针对每一行输出执行,第一个 awk 打印在 day 变量中,第二个在 day 变量中file(每行)。我在这里使用引号有点不必要,因为在给定变量设置方法的情况下,变量中不会有空格。

执行此类操作的最安全方法——也是执行速度最快的方法——是对数据使用 awk 以输出 shell 脚本。在 awk 中,打印您希望执行的 mkdircp 命令。将结果输入 head(1) 直到您满意为止。也许看看 less(1) 中的全部内容。然后执行如下:

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

这会将命令回显到标准错误,并在出现第一个错误时停止。如果您非常确定它是正确的,请删除 x 选项。

与 awk 中的循环或一堆子进程(使用 system 函数)相比,这种方法的优势在于:

  • 你可以看到将要发生什么,正在发生什么
  • 执行速度