2015-02-07 130 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}"'