Который является лучшим способом искать - находят с regex или находят с grep?

Вы знаете, что необходимо добавить, что x (выполняет) флаг на Unix для выполнения сценария оболочки? Другая распространенная ошибка для пользователей DOS - то, что из соображений безопасности существует часто не в Среде ПУТИ таким образом, необходимо работать "./your-script" вместо просто "Вашего-сценария".

Относительно хижины, упомянутой в другом ответе. По крайней мере, на Linux/bin/sh является оболочкой по умолчанию, используемой, если никакая хижина не дана в сценарии. Это - все еще хорошая практика, чтобы всегда добавить ту ко всем сценариям.

4
12.09.2012, 22:33
3 ответа

Имя файла UNIX может обычно состоять из октетов (8-разрядные байты), за исключением 0x00 (ПУСТОЙ УКАЗАТЕЛЬ) и 0x2F (/). Любой октет допустим. Это включает такие хорошие вещи как 0x0A (новая строка).

Ваш find пример обработает имена файлов со странными символами, такими как новая строка правильно.

Ваш find | grep пример даст нечетные и неправильные результаты, когда сталкивающийся с такой вещью (это будет видеть один файл, названный "строка 1\nline 2" как два файла).

Можно использовать find -print0 | grep -z (если Вы используете версии GNU, например, на Linux); это сохранит правильность. Это будет использовать немного больше памяти. Обратите внимание, что можно сказать, находят для использования расширенных регулярных выражений (например), с помощью -regextype опция.

Если Вы хотите сделать некоторое действительно сложное соответствие, можно понравиться find2perl сценарий, который преобразует a find командная строка в к короткой программе жемчуга можно затем отредактировать для добавления в сложности.

6
27.01.2020, 20:46

find . -regex ".*/.*abc.*" быстрее потому что find . | grep ".*abc.*" должен иметь find генерируйте все данные и передайте их к grep. Разница, вероятно, будет небольшой все же. find . -regex ".*/.*abc.*" также более надежно, потому что это работает даже в редком случае, где у Вас есть имена файлов с пробелами.

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

find -name '*abc*'

В ksh, ударе или zsh, можно работать echo **/*abc* вместо этого: **/ взгляды во всех подкаталогах рекурсивно. В ksh необходимо будет работать set -o globstar сначала (вставляет это Ваш ~/.kshrc). В ударе необходимо будет работать shopt -s globstar сначала (вставляет это Ваш ~/.bashrc).

6
27.01.2020, 20:46
  • 1
    То, почему "находят, должно иметь find генерировать все данные"? Насколько я знаю, что данные автоматически регулярно сбрасываются и передаются каналу. Это - то, как канал обычно работает. Другой пример: попробовать yes | cat. Если кошка ожидала всех данных из yes который является бесконечным потоком затем, он наконец никогда не начинал бы писать данные в вывод. –  sasha.sochka 26.01.2014, 17:16
  • 2
    @sasha.sochka find генерирует все данные и передает его через канал. Это делает это параллельно с grep. –  Gilles 'SO- stop being evil' 26.01.2014, 17:59
  • 3
    О, да, извините в первый раз, когда я упустил суть. –  sasha.sochka 26.01.2014, 18:22

Если Вы используете сопоставление с образцом с find, можно добавить другие предикаты или поведения:

# look only for matching directories
find . -regex ".*/.*abc.*" -type d

# run a command on each match
find . -regex ".*/.*abc.*" -exec echo 'I found a file named {}' ';'

find могло бы быть быстрее для того, чтобы просто искать также, потому что Вы не должны порождать a grep обработайте или выполните любую передачу по каналу; но я сомневаюсь, что Вы смогли бы заметить.

4
27.01.2020, 20:46

Теги

Похожие вопросы