我想使用以下命令仅删除 2010 年 1 月的目录
ls -lh | awk '{print $6 " " $9}' | sed -n '/Jan/p' | awk '{print $2}' >>/tmp/file_list
上述命令将列出日期为 1 月份的所有目录,但我的列表中有 2010 年 1 月和 2011 年 1 月。
有人能帮助我使用 SED 命令列出截至 2010 年 1 月的目录吗?
答案1
您可以使用 grep 代替 awk/sed,也许像这样?
ls -lh | grep -o 'Jan [ 1-2][0-9] 2010 .*$' | awk '{print $4}' >> /tmp/file_list
您所遇到的问题是第一个 awk 没有包括年份,因此 2011(或 2009、2008 等)全部显示在发送给 sed 的列表中。
答案2
永远不要尝试解析输出ls
以用于显示目的以外的任何目的——这是一个馊主意。
虽然它使用 find 和 xargs 而不是 sed,但也许类似这样的方法可以工作。请注意,它尚未经过测试。
jan01="$(date -d '20100101 00:00' +%s)"
feb01="$(date -d '20100201 00:00' +%s)"
today="$(date -d '23:59:59' +%s)"
daysecs="$((24*60*60))" # 86400
dayssincefeb01="$(((today - feb01) / daysecs ))"
dayssincejan01="$(((today - jan01 + 1) / daysecs ))"
find /path -type d -mtime +"$dayssincefeb01" -mtime -"$dayssincejan01" \
-print0 | xargs -0 rm -r
最后的 find 命令会查找早于 2010 年 2 月 1 日但早于 2010 年 1 月 1 日的目录,并使用'\0'
空字符将它们安全地传输到 xargs。