Bash - 用于完成命令的引号

时间:2015-02-07 09:40:09

标签: 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

即使我想拆分空格,我选择了+,因此空格或制表符之间没有混淆。

3 个答案:

答案 0 :(得分:2)

find命令更改为:

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

请注意\$1awk命令行内所需的sh -c

答案 1 :(得分:0)

只需将FS =“”更改为FS = \“\”

'+'是特殊的,在awk和其他几个正则表达式实现中它意味着1个或多个字符。

你需要使用\\ +转义+,因为它在双引号内。

要理解您希望脚本实际执行的操作有点困难。

如果您只想要当前目录中文件的修改日期(YYYY-dd-mm),那么您可以使用:

找到。 -maxdepth 1 -exec stat -c%y {}';'

请注意,stat(1)在不同的unices上是不同的。

答案 2 :(得分: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}"'