Удалить каталоги от Linux 2010 года в Linux

1

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

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

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

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

AlBouazizi
источник
find специально создан для решения подобных проблем. Потратьте время, чтобы освоить его, это делает такие проблемы, как этот шов тривиальным.
nelaaro

Ответы:

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.

Джон Лин
источник
спасибо за ваш ответ, я получил список каталогов, но есть ли способ напечатать дату в выходном файле?
AlBouazizi
Если вам нужны дата и файл, вы можете избавиться от последнего awk (который печатает только файл). Без последнего awk вы получите: «Jan», затем дату, затем «2010», затем имя файла.
Джон Лин
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'нулевой символ.

jw013
источник
./rm_dir_test.sh: строка 1: 24 * 60 * 60: команда не найдена ./rm_dir_test.sh: строка 8:): синтаксическая ошибка: ожидается операнд (маркер ошибки ")") ./rm_dir_test.sh: строка 9 +' to
:)
@AlBouazizi Извините, у меня была опечатка в этой строке (пропущена скобка). Должно быть исправлено сейчас.
jw013
спасибо за ваши усилия .. я хочу проверить вывод с помощью xargs -0 ls -l >> output.file это выполнимо?
AlBouazizi
Вы можете просто заменить rm -rс ls -l.
jw013