我试图ls -l
仅使用和过滤当月最后修改的文件。我正在运行:ls -l | awk '{if($6 == date +%b) print$0;
并收到语法错误。
我一直在互联网上到处寻找关于如何在 awk 和脚本 bashing 中正确使用引号的简单规则,但我无法理解它。尽管我有编程经验,但我对此感到非常困惑,因此关于这些问题的一般答案比处理这种特定情况的具体答案更受欢迎。
答案1
您可能不想date
在代码中多次调用;它在运行期间是“恒定的”。所以我们可以预先设置它并将其作为变量传递
例如
ls -l | awk -v month="$(date +%b)" '$6 == month { print }'
请注意,如果您有一个从本月开始但已有一年的文件(例如从 2015 年 8 月开始),或者在月份名称包含空格的区域设置中,或者如果文件名包含换行符,则此操作将会失败。 解析 ls 的输出充满危险
答案2
那么尝试这个循环作为变体。它存储今天的当前月份和年份,然后使用 shell globbing ( *
) 获取文件列表(类似于ls -l
will - 但不像ls -al
will),然后使用 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