Я не могу воспроизвести точно то, что вы описываете, но у меня есть несколько предложений по написанию более надежных команд.
cut -d' '
разделяет поля пробелами.Если у вас есть два пробела подряд, между ними есть пустое поле.Поэтому, если вы попытаетесь использовать Aug 1
вместо Jul 25
, столбец с именем файла будет смещен на 1. А если вы попытаетесь использовать файлы, возраст которых превышает 6 месяцев, то время (5 символов) будет заменено пробеломк 4-значному году.Кроме того, в зависимости от вашей версии ls
между столбцами может быть несколько пробелов.Еще одна проблема заключается в том, что некоторые версии ls
не отображают столбец group
.И тогда некоторые имена файлов содержат пробелы.И некоторые имена файлов содержат специальные символы, которые ls
могут отображаться как ?
.Таким образом, вы не можете проанализировать вывод ls -l
путем подсчета пробелов, и вы даже не можете проанализировать вывод ls -l
путем подсчета полей, разделенных пробелами.Просто не анализирует вывод ls .
Стандартная команда для генерации списков имен существующих файлов - find
.Поскольку вы упоминаете Linux, я упомяну опции, которые работают с GNU find (версия, которую вы получаете для Linux), но не для других unixes.
Давайте начнем с простого: перечислим файлы с именем tmp.*
в текущем каталоге.
find . -name 'tmp.*'
Нам нужны только файлы, созданные 25 июля, то есть 7 дней назад.
find . -name 'tmp.*' -daystart -mtime 7
Это хрупкий файл, потому что он не будет работать завтра.Обычный способ указать точную дату - создать файлы с самой ранней и самой поздней допустимой датой и указать find
возвращать только файлы с этими двумя значениями.
touch -t 201007250000 .earliest
touch -t 201007260000 .latest
find . -name 'tmp.*' -newer .earliest \! -newer .latest
rm .earliest .latest
Команда find
исследует подкаталогирекурсивно.Если вы не хотите этого:
find . -name 'tmp.*' -daystart -mindepth 1 -maxdepth 1 -mtime 7
Если вы хотите, чтобы файлы сортировались по размеру:
find . -name 'tmp.*' -daystart -mtime 7 -printf '%s\t%p\n' | sort -n -k 1 | cut -f 2-
Наконец, если вы хотите работать с файлами, никогда используйте find
в обратных тегах, как вы использовали ls
, потому что это не удастся, если имена файлов содержат пробел или некоторые специальные символы, потому что оболочка разделяет вывод `command`
на пробел, а затем выполняет глобализациюрезультирующие слова.Вместо этого используйте параметр -exec
для find
;версия ;
выполняет mycommand
один раз для файла с {}
, замененным именем файла, тогда как версия +
обычно вызывает mycommand
только один раз с {}
, замененным списком имен файлов.
find . -name 'tmp.*' -daystart -mtime 7 -exec mycommand -myoption {} \;
find . -name 'tmp.*' -daystart -mtime 7 -exec mycommand -myoption {} +