我以前曾多次遇到过这个问题,并且总是找到另一种方法来编写我的命令。
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
即使我想拆分空格,我选择了+
,因此空格或制表符之间没有混淆。
答案 0 :(得分: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
。
答案 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}"'