【问题标题】:Linux CP using AWK output使用 AWK 输出的 Linux CP
【发布时间】:2016-11-14 19:00:10
【问题描述】:

我一直在努力学习更多关于 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.

每个目录一次。

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

【问题讨论】:

  • 为什么要将mkdir 的输出传送到lsmkdir 不产生任何输出(错误消息除外),ls 不使用其输入。
  • 第二个 LS 语句的原因是,在 mkdir 之后,我无法从原始 LS 访问文件名,所以我再次运行它以重新创建该列表。有没有更好的方法?
  • @Cronisej 是的,看我的回答。
  • @Cronisej 我明白你为什么有第二个ls 声明。我不明白的是为什么您将某些内容通过管道传输到其中,而不是仅将其作为单独的命令运行。
  • 例如ls ... | awk ... | mkdir; ls ... | awk ... | cp ...

标签: linux bash awk cp


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

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

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

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

    • 您可以看到将要发生的事情,以及正在发生的事情
    • 执行速度

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-15
      • 1970-01-01
      • 2016-06-13
      • 1970-01-01
      相关资源
      最近更新 更多