使用AWK输出的linuxcp

使用AWK输出的linuxcp,linux,bash,awk,cp,Linux,Bash,Awk,Cp,我一直在努力学习更多关于Linux的知识,今天上午我主要关注awk命令。下面是我一直试图开始工作的命令 ls -lRt lpftp.* | awk '{print $7, $9}' | mkdir -p $(awk '{print $1}') | ls -lRt lpftp.* | cp $(awk '{print $9, $7}') 本质上,我试图将目录中的每个文件移动到一个子目录中,该子目录基于上次修改的文件。该命令首先只打印我想要的文件,然后使用mkdir根据上次修改的月份创建一个文件夹

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


有人知道我如何解决这个问题吗?或者,如果有更好的方法来处理它?

ls-lRt lpftp.*| awk'{print$7,$9}'|同时读取日文件;do mkdir-p“$day”;cp“$file”“$day”;完成


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

这样做最安全的方法——也是执行最快的方法——是对数据使用awk来输出shell脚本。在awk中,打印希望执行的
mkdir
cp
命令。将结果导入头(1),直到您满意为止。也许你可以在小范围内看看整个事情。然后执行如下操作:

ls -lRg lpfpt.* | awk script.awk | sh -ex
这会将命令回显到标准错误,并在第一个错误时停止。如果您非常肯定它是正确的,请删除
x
选项

与awk中的一个循环或一组子流程相比(使用
系统
功能),这种方法的优点是:

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

为什么要将
mkdir
的输出通过管道传输到
ls
mkdir
不生成任何输出(错误消息除外),并且
ls
不使用其输入。第二个ls语句的原因是,在mkdir之后,我无法从原始ls访问文件名,因此我再次运行它以重新创建该列表。有更好的方法吗?@Cronisej是的,请看我的答案。@Cronisej我理解您为什么有第二个
ls
语句。我不明白的是,为什么你要用管道把一些东西插入其中,而不是把它作为一个单独的命令来运行<代码>ls…|啊…|mkdir;是…|啊…|cp…