Grep внутри файлов, возвращенных из ls и head

У меня есть каталог с большим количеством файлов. Я пытаюсь найти текст, расположенный хотя бы в одном из файлов. Текст, вероятно, находится в одном из последних файлов. Какая команда для этого? Я думал, что это будет выглядеть примерно так: ls -t | head -5 | grep abaaba.

Например, если у меня есть 5 файлов, возвращенных из ls -t | head -5: - файл1, файл2, файл3, файл4, файл5, мне нужно знать, какой из этих файлов содержит abaaba.


person KPrince36    schedule 22.07.2015    source источник
comment
Обычно, если у вас нет пробелов (пробелов, табуляции, новой строки и т. д.) в именах файлов или каталогов, тогда: ls -t | head -5 | xargs grep abaaba. Если вокруг вас есть пустое пространство, то вам придется больше работать; неясно, является ли ls частью ответа (более вероятно, что это часть проблемы).   -  person Jonathan Leffler    schedule 23.07.2015
comment
xargs : abaaba : нет такого файла или каталога   -  person KPrince36    schedule 23.07.2015
comment
Вы включили xargs grep abaaba? Звучит так, как будто вы пропустили grep.   -  person Jonathan Leffler    schedule 23.07.2015


Ответы (2)


Не совсем понятно, что вы пытаетесь сделать. Но я предполагаю, что эффективность - ваша главная цель. Я бы использовал что-то вроде:

ls -t | while read -r f; do grep -lF abaaba "$f" && break;done

Это напечатает только первый файл, содержащий строку, и остановит поиск. Если вы хотите увидеть настоящие строки, используйте -H вместо -l. И если у вас есть регулярное выражение вместо простого отбрасывания строки -F, это, однако, заставит grep работать медленнее.

ls -t | while read -r f; do grep -H abaaba "$f" && break;done

Конечно, если вы хотите продолжить поиск, я предлагаю отказаться от «&& break».

ls -t | while read -r f; do grep -HF abaaba "$f";done

Если у вас есть идеи по поводу временных рамок, попробуйте их найти.

find . -maxdepth 1 -type f -mtime -2 -exec grep -HF abaaba {} \;

Вы можете увеличить число после -mtime, чтобы покрыть более последних 2 дней.

person Miroslav Franc    schedule 22.07.2015
comment
Используя ваши команды, вы потеряете информацию об именах файлов. Вся проблема, похоже, в том, чтобы найти эти имена файлов, поэтому, на мой взгляд, лучше использовать grep -H. - person MaxChinni; 23.07.2015

Если вы просто делаете это в интерактивном режиме и знаете, что в ваших именах файлов нет пробелов, вы можете сделать:

grep abaaba $(ls -t | head -5)   # DO NOT USE THIS IN A SCRIPT

Если вы пишете это в псевдониме или для повторного использования в будущем, делайте это «правильным» способом, который требует больше ввода, но не нарушает пробелы и другие вещи в именах файлов.

person Peter Cordes    schedule 23.07.2015