2015-02-07 86 views
1

我以前遇到过这个问题很多次,并且总是发现了另一种写入命令的方法。Bash - 超出引号以完成命令

find . -maxdepth 1 -type f -printf '%f\n' | xargs -I xx sh -c 'stat -c%y xx | awk "BEGIN{FS=" "}{print $1}"' 

问题是FS=" "实际收出BEGIN",我不能用',因为它是将整个命令xargs

由于'"是唯一的报价我有机会获得,我怎样才能做到上述工作?

编辑: 逃避我这一次

find . -maxdepth 1 -type f -printf '%f\n' | xargs -I xx sh -c 'stat -c%y xx | awk "BEGIN{FS=\"+\"}{print $2}"' 
2014-04-12 22:34:47.000000000 +0000 
2014-11-25 04:05:39.000000000 +0000 
2015-02-07 09:23:42.000000000 +0000 
2014-04-12 22:32:55.000000000 +0000 
2014-04-12 22:33:59.000000000 +0000 
2014-08-03 07:27:28.000000000 +0000 
2014-04-12 22:32:03.000000000 +0000 
2014-04-12 22:30:56.000000000 +0000 

即使我想拆的空间没有工作,我选择了+所以有一个空格或制表符之间没有混淆。

+1

难道这个单一的命令适合你吗? '找。 -maxdepth 1 -type f -printf'%TY-%Tm-%Td \ n'' – 2015-02-07 10:40:13

回答

2

更改find命令是:

find . -maxdepth 1 -type f -printf '%f\n' | 
    xargs -I xx sh -c "stat -c '%y' file | awk '{print \$1}'" 

注意到\$1因为awk它需要的是sh -c命令行内。

0

只要改变FS = “ ”到fs = \“ \”

'+' 是特殊的,在AWK和其他几个regex实现这意味着1个或多个字符。

您将需要与\\ +逃跑+,因为它是双引号。

这是一个有点很难理解你希望你的脚本实际做了什么。

如果你只是想在当前目录下的文件的修改日期(YYYY-MM-DD),那么你就可以做到这一点:

发现。 -maxdepth 1 -exec stat -c%y {}';'

要注意的是STAT(1)是在不同的Unix系统不同。

+0

这对我不起作用,请参阅编辑 – Cripto 2015-02-07 09:47:07

0

sh/bash中,您可以通过在双引号字符串中加一个反斜杠来转义双引号。在你bash情况下,该字符串是单引号,这样你就可以反斜线之前添加的每个双嵌套双引号,它会在bash背景下保存下来(因为单引号字符串不碰任何东西在解析期间在字符串中)以及在sh上下文中,反斜杠后跟的双引号将在外部双引号字符串内正确转义。

啊,这里面的第二个问题:$1被插入的外双引号字符串(即awk参数),它正在扩大,没有内的变量替换,所以你awk命令最终只调用print没有参数,可以打印整个输入行。你也可以通过反斜杠逃脱美元来解决这个问题。所以:

find . -maxdepth 1 -type f -printf '%f\n' | xargs -I xx sh -c 'stat -c%y xx | awk "BEGIN{FS=\" \"}{print \$1}"'