Вы знаете, что необходимо добавить, что x (выполняет) флаг на Unix для выполнения сценария оболочки? Другая распространенная ошибка для пользователей DOS - то, что из соображений безопасности существует часто не в Среде ПУТИ таким образом, необходимо работать "./your-script" вместо просто "Вашего-сценария".
Относительно хижины, упомянутой в другом ответе. По крайней мере, на Linux/bin/sh является оболочкой по умолчанию, используемой, если никакая хижина не дана в сценарии. Это - все еще хорошая практика, чтобы всегда добавить ту ко всем сценариям.
Имя файла UNIX может обычно состоять из октетов (8-разрядные байты), за исключением 0x00 (ПУСТОЙ УКАЗАТЕЛЬ) и 0x2F (/). Любой октет допустим. Это включает такие хорошие вещи как 0x0A (новая строка).
Ваш find
пример обработает имена файлов со странными символами, такими как новая строка правильно.
Ваш find | grep
пример даст нечетные и неправильные результаты, когда сталкивающийся с такой вещью (это будет видеть один файл, названный "строка 1\nline 2" как два файла).
Можно использовать find -print0 | grep -z
(если Вы используете версии GNU, например, на Linux); это сохранит правильность. Это будет использовать немного больше памяти. Обратите внимание, что можно сказать, находят для использования расширенных регулярных выражений (например), с помощью -regextype
опция.
Если Вы хотите сделать некоторое действительно сложное соответствие, можно понравиться find2perl
сценарий, который преобразует a find
командная строка в к короткой программе жемчуга можно затем отредактировать для добавления в сложности.
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
).
find
генерировать все данные"? Насколько я знаю, что данные автоматически регулярно сбрасываются и передаются каналу. Это - то, как канал обычно работает. Другой пример: попробовать yes | cat
. Если кошка ожидала всех данных из yes
который является бесконечным потоком затем, он наконец никогда не начинал бы писать данные в вывод.
– sasha.sochka
26.01.2014, 17:16
find
генерирует все данные и передает его через канал. Это делает это параллельно с grep
.
– Gilles 'SO- stop being evil'
26.01.2014, 17:59
Если Вы используете сопоставление с образцом с 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
обработайте или выполните любую передачу по каналу; но я сомневаюсь, что Вы смогли бы заметить.