1

Я хочу использовать следующую команду для удаления каталогов только от января 2010

ls -lh | awk '{print $6 " " $9}' | sed -n '/Jan/p' | awk '{print $2}' >>/tmp/file_list

Приведенная выше команда выведет список всех каталогов, датированных январем, но у меня в списке есть январь 2010 и январь 2011.

Может кто-нибудь может помочь мне с командой SED перечислить только дату каталогов Январь 2010?

2 ответа2

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 в конце находит каталоги старше 1 февраля 2010 года, но моложе 01 января 2010 года и безопасно передает их в xargs, используя нулевой символ '\0' .

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.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .