unix поиск файлов по дате, от последних созданных до наименее последних созданных - PullRequest
0 голосов
/ 07 января 2020

в папке a в то время, 18:00, я создаю файл 6 с текстом ab c

в папке a/b в то время, 19:00, я создаю файл 7 с текстом ab c

в папке a в то время, в 8 вечера, я создаю файл 8 с текстом ab c

В папке a я хочу найти все файлы с текстом abc, закажите их по из последних созданных в наименее недавно созданных. Я выполняю поиск по ls -hlt | grep -ir abc * мои результаты

6:abc
8:abc
b/7:abc

, но я хочу следующее. Как мне его получить?

8:abc
b:\7:abc
6:abc

Обновление: ls -lt | grep -ir abc * хорошо работает для возврата файлов с ab c, от самого старого к новейшему, где `` ls -lt` показывает файлы, новые для старых. Не уверен, почему grep мешает потоку

Ответы [ 3 ]

0 голосов
/ 07 января 2020

Большие проблемы делятся на маленькие проблемы.

  • Найдите все файлы, которые содержат 'ab c', игнорируя регистр.
  • Напечатайте каждое имя файла с указанием времени его создания, поскольку эпоха.
  • Сортировать список имен файлов по дате.
  • Удалить дату создания из списка, оставив имена файлов.

Итак, это:

grep -irl ABC . |
xargs -d$'\n' -n1 sh -c 'printf "%s\t%s\n" "$(stat -c "%W" "$1")" "$1"' -- |
sort -n -k1 |
cut -f2-

Протестировано (обратите внимание на stat -c "%Y" против stat -c "%W"):

rm -rf a
mkdir -p a/b
echo abc > a/6
touch -d@1 a/6
echo abc > a/b/7
touch -d@2 a/b/7
echo abc > a/8
touch -d@3 a/8

grep -irl abc ./a |
xargs -d$'\n' -n1 sh -c 'printf "%s\t%s\n" "$(stat -c "%Y" "$1")" "$1"' -- |
sort -n -k1 |
cut -f2-

на репл-выходы :

./a/6
./a/b/7
./a/8
0 голосов
/ 07 января 2020

Существует общая проблема c с такими командами, как ls или find. Это потому, что имена файлов могут стать действительно интересными, когда они имеют специальные символы. Вы можете прочитать больше об этом в этом Bash Pitfall и BashFAQ 20

Наиболее приемлемый подход заключается в создании списка файлов, где имена файлов разделяются NULL-символ (\0). GNU grep имеет возможность создать такой список, используя флаг -Z:

-Z, --null: Вывести нулевой байт (символ ASCII NUL) вместо символа это обычно следует за именем файла. Например, grep -lZ выводит нулевой байт после каждого имени файла вместо обычной новой строки. Эта опция делает вывод однозначным, даже при наличии имен файлов, содержащих необычные символы, такие как символы новой строки. Эта опция может использоваться с такими командами, как find -print0, perl -0, sort -z и xargs -0 для обработки произвольных имен файлов, даже тех, которые содержат символы новой строки.

source : man grep

Теперь мы можем использовать это в вопросе OP:

$ grep -lZR "abc" a/

предоставит нам разделенный нулем список файлы, которые теперь могут храниться в массиве для дальнейшей обработки (см. Захват результатов поиска. -print0 в bash массив )

unset a i
while IFS= read -r -d $'\0' file; do
  a[i++]="$file"        # or however you want to process each file
done < <(grep -lZR "abc" a/)

На данный момент мы имеем теперь массив a, который мы можем использовать, чтобы делать все, что мы хотим. Например, список всех файлов, отсортированных по времени модификации:

$ ls -lrt "${a[@]}"
0 голосов
/ 07 января 2020

Я думаю, это то, что вы хотите. Он покажет файлы со словом «ab c». сначала новые.

ls -Rt1 | grep "*abc*"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...