1

Я знаю, что find может делать то, что я ищу, но мне интересно, есть ли альтернативный способ поиска файлов в файловой системе, созданных до / после определенного момента или в определенное время.

Обычно я полагаюсь на updatedb & locate для большинства моих потребностей в поиске файлов. Проблемы с этими инструментами, однако, заключаются в том, что у него есть только имена каталогов и файлов, и он создает только базу данных локальных каталогов, а не что-либо, смонтированное через CIFS | NFS или через -o loop (например, изображения .iso).

Поэтому, если мне нужно найти файлы, созданные после вчерашнего дня во всей системе (локальные и удаленные файловые системы), мне нужно использовать find .

Какие другие инструменты, если таковые имеются, могли бы сделать это аналогичным образом?

Я пробовал ls и grep , но это требует (в моих попытках пока) многократного поиска:

ls -lR | grep Aug | grep 10
ls -lR | grep Aug | grep 11

6 ответов6

1

Вы можете использовать альтернативы с egrep:

ls -lR | egrep "Aug *10|Aug *11"
1

Я хотел бы спросить, почему вы не хотите использовать find, но я не думаю, что я действительно хочу знать ...

Я бы попробовал с awk:

ls -lR | awk '{ d="^2011-0[78]"; if ($6 ~ d){ print $0 }}'

D в команде является регулярным выражением.
Затем 6-й столбец из вывода ls оценивается с помощью предоставленного регулярного выражения, и вся строка печатается, только если это так.
В моей системе дата указана в формате гггг-мм-дд чч: ми, и с помощью регулярных выражений я искал файлы за июль и август. Изменить регулярное выражение для ваших нужд.

Также добавим, почему я выбрал awk: вы можете заменить print $ 0 на print $ 8, и вы получите только имя файла на выходе - с grep regex будет беспорядок ...

1

я не уверен, что для одной команды, которую нужно быстро набрать, лучше использовать скрипт, который делает одну сложную строку или несколько. Там эта строка, которая использует регулярное выражение
$ls -lR | grep -E "2011-08-1[01]"
Регулярное выражение типа a [bc] означает a, за которым следует b или c. Итак, 1 [01] охватывает 10 и 11. Вы можете сделать 1 [0-3] для 10-13, хотя мы еще не написали дату 13-го числа. Это будет 07 или 08 или 09 или 10 или 11 ... 13. 0 [7-9] | 1 [0123].

1

Вы можете использовать -nt и -ot build в тестах bash. Из руководства по bash:

file1 -nt file2: True, если file1 новее (в соответствии с датой изменения), чем file2, или если file1 существует, а file2 нет.

file1 -ot file2: True, если file1 старше file2 или если file2 существует, а file1 нет.

Для создания тестового временного файла вы можете использовать сенсорный.

Чтобы перебрать файлы в каталоге, вы можете использовать расширение оболочки и сборку bash в тестах bash для тестирования каталога (-d file). Но будьте осторожны с петлями ссылок в файловой системе.

1

Вы можете создать временный файл с отметкой времени вашего поиска, а затем использовать опцию сортировки ls: файлы, которые вы ищете, будут до (или после) временного файла.

Разделение файлов (или разделение вывода ls) обсуждается в разделении файлов Linux.

1

Вы можете настроить вывод временной метки ls, чтобы было более легко понять:

ls -ln --time-style="+%Y%m%d%H%M%N"

и тогда сравнение дат так же просто, как сравнение строк. Вы должны сделать это с помощью awk:

ls -ln --time-style="+%Y%m%d%H%M%N" | tail -n +2 | awk -F " " '$6 > "201108100000000000000" {$1=$2=$3=$4=$5=$6=""; print substr($0, 7)}'

Будьте осторожны, используя правильную опцию -a или -c для правильного времени файла.

И помните, что ctime - это не время создания, это время изменения inode (создание, разрешение, изменение размера файла, ...).

Редактировать:

awk можно даже избежать:

ls -ln --time-style="+%Y%m%d%H%M%N" | tail -n +2 | \
while read perms inode user group size date file; do
  if [ $date > "201108100000000000000" ]; then
    printf "%s\n" "$file"
  fi
done

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