Linux

嘗試同時使用 awk 和 date 命令

  • August 25, 2016

我正在嘗試ls -l僅使用和過濾當月最後修改的文件。我正在執行:ls -l | awk '{if($6 == date +%b) print$0;並收到語法錯誤。

我一直在網際網路上到處尋找關於如何在 awk 和腳本抨擊中正確使用引號的簡單規則,但我無法理解它。儘管我有程式經驗,但我對此感到非常困惑,因此對於這些問題的一般答案將比處理這種特定情況的具體答案更受歡迎。

您可能不想date在程式碼中多次呼叫;在執行期間它是“恆定的”。所以我們可以預先設置它並將其作為變數傳遞

例如

ls -l | awk -v month="$(date +%b)" '$6 == month { print }'

請注意,如果您有一個從本月開始但一年前的文件(例如,從 2015 年 8 月開始),或者在月份名稱包含空格的語言環境中,或者如果存在包含換行符的文件名,這將失敗。 解析 ls 的輸出充滿了危險

那麼試試這個循環作為變體。它儲存今天的目前月份和年份,然後使用 shell globbing ( *) 來獲取文件列表(就像 a ls -lwill – 但不像 an ls -alwould),然後使用 GNU 提供的stat命令來提取每個文件的修改時間並提取月份和年份。如果那個月份和年份與目前月份和年份相同,則ls -ld對文件執行 an(該-d標誌是為了防止在 $f 是目錄時出現意外的子目錄列表)。

thisym=$(date +%Y-%m)
for f in *
do
 ym=$(stat -c %y -- "$f" | cut -d- -f1-2)
 if [ "$ym" = "$thisym" ]
 then
   ls -ld -- "$f"
 fi
done

引用自:https://unix.stackexchange.com/questions/305701