2010-11-23 4 views
4

Как удалить файл, созданный в определенную дату ??удалить конкретную дату

ls -ltr | grep "Nov 22" | rm - почему это не wrking ??

+2

Проблема с вашим кодом заключается в том, что `rm` не принимает ввода на stdin (через канал), вы должны передать файлы для удаления в качестве аргументов. – SiegeX 2010-11-23 10:19:01

ответ

6

Есть три проблемы с вашим кодом:

  • rm берет свои аргументы из командной строки, но вы не передаете любое имя файла на командная строка. Вы передаете данные на стандартный ввод, но rm не читает это¹. Есть способы обойти это.
  • Результат ls -ltr | grep "Nov 22" состоит не только из имен файлов, но и состоит из mangled имен файлов плюс куча другой информации, такой как время.
  • Фильтр grep не только будет перехватывать файлы, измененные 22 ноября; он также поймает файлы, чье имя содержит Nov 22, среди прочих. Он также не будет ловить файлы, которые вы хотите, в локали, которая отображает даты по-разному.

Команда find позволяет вам искать файлы в соответствии с такими критериями, как их имя, соответствующее определенному шаблону, или дата их нахождения в определенном диапазоне. Например, следующая команда будет перечислять файлы в текущем каталоге и его подкаталогах, которые были изменены сегодня (по дате календаря по Гринвичу). Замените echo на rm -- после того, как вы проверили, что у вас есть нужные файлы.

find . -type f -mtime -2 -exec echo {} + 

С GNU найти, например, найти на Linux и Cygwin, есть несколько вариантов, которые могли бы сделать лучше:

  • -maxdepth 1 (должен быть указан перед другими критериями) ограничивает поиск указанный каталог (то есть он не рекурсирует).
  • -mmin -43 соответствует файлам, измененным не более 42 минут назад.
  • -newermt "Nov 22" соответствует файлам, измененным 22 ноября или позднее, по местному времени.

Таким образом:

find . -maxdepth 1 -type f -newermt "Nov 22" \! -newermt "Nov 23" -exec echo {} + 

или, сокращенно дополнительно:

find -maxdepth 1 -type f -newermt "Nov 22" \! -newermt "Nov 23" -delete 

С Zsh, то mglob qualifier ограничивает шаблон для файлов модифицированных в пределах определенного относительного диапазона дат. Например, *(m1) расширяет файлы, измененные за последние 24 часа; *(m-3) расширяет файлы, измененные за последние 48 часов (сначала число дней округляется до целого числа, тогда - обозначает строгое неравенство); *(mm-6) расширяет файлы, измененные за последние 5 минут и так далее.

¹ rm -i (и простой rm только для чтения-файлов) использует его для чтения подтверждения y перед удалением.

1

Вы бы лучше подходит для использования find команду:

find . -type f -mtime 1 -exec echo rm {} + 

Это удалит все файлы один день старые в текущем каталоге и рекурсии вниз в его подкаталогах. Вы можете использовать '0', если хотите удалить файлы, созданные сегодня. Как только вы удовлетворены результатом, удалите echo, и файлы будут действительно удалены.

+0

спасибо за ответ Siegex, но можете ли вы сказать мне, что wats the prblm с моим кодом – nachikethas 2010-11-23 10:01:50

2

Если вам нужно попытаться найти в любой день,
это может помочь

touch -d "2010-11-21 23:59:59" /tmp/date.start; 
touch -d "2010-11-23 00:00:00" /tmp/date.end; 
find ./ -type f -newer /tmp/date.start ! -newer /tmp/date.end -exec rm {} \; 
+1

Terminate -exec с `+` вместо `\;`, и вы получите повышение производительности, когда вы сопоставляете много файлов, поскольку оно ведет себя просто как `xargs` в этом отношении. – SiegeX 2010-11-23 17:11:25

-3

Это будет работать

rm `ls -ltr | grep "Nov 22" | awk '{print $8}'` 
+0

Как насчет пробелов в именах файлов? – khachik 2010-11-23 15:04:16

+0

Хорошая точка ~ awk '{print $ 8 "\\" $ 9}' может работать для простых случаев, но это рискованно. Сначала я предпочел бы заменить пробелы в именах файлов. – gerry 2010-11-23 15:27:03

+2

Самое худшее, что вы можете сделать, это попытаться разобрать ls, а вторая хуже, что вы можете сделать, - попытаться удалить файл на основе разбора ls. См. [Почему я не должен анализировать ls] (http://mywiki.wooledge.org/ParsingLs) – SiegeX 2010-11-23 17:03:57

1

Если ваш find поддерживает ее, как GNU find делает, вы можете использование:

find -type f -newermt "Nov 21" ! -newermt "Nov 22" -delete 

, который будет искать файлы, которые были изменены в ноябре 21.

Смежные вопросы