У меня есть дерево каталогов, где в некоторых каталогах есть пробелы в именах:

top
|-- subdir 1
    |-- subdir a
        |-- file1.csv
        |-- file2.csv
    |-- subdir b
        |-- file1.csv
    |-- subdir c
        |-- file3.csv

Я хочу написать команду grep для рекурсивного поиска текста в структуре каталогов, но выходные данные должны быть отсортированы в соответствии с отметкой времени файлов. Закрытие, которое я получил, таково:

find . -name *.csv | sort | xargs grep "some text" -0

Проблема в том, что пробелы сбрасывают grep и вы получаете результаты, как

grep: ./subdir: нет такого файла или каталога
grep: 1: нет такого файла или каталога

Это интерпретирует subdir 1 как два отдельных каталога, subdir и 1 . Как я могу это сделать?

1 ответ1

0

Да, эти пространства являются проблемой. Если используемые вами инструменты могут работать со строками с нулевым символом в конце, это так:

find . -name "*.csv" -print0 | sort -z | xargs -0 grep "some text"

Этот подход также должен работать в вашем случае:

find . -name "*.csv" | sort | xargs -I {} grep "some text" {}

Заметки:

  • Я не знаю, как этот sort делает «выходные данные, отсортированные по меткам времени файлов». Я просто отлаживаю твою команду.
  • Вам нужно цитировать *.csv как я сделал, чтобы избежать этого сценария.

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