Понимание команды поиска

в этом репо:https://github.com/diederikdehaas/rtl8814AU

есть команда конвертировать в unix. 'исходная цитата'

Converted all line endings to unix.

The command used to perform that was: find. -path./.git -prune -o -name '*' -type f -print | xargs egrep -l $'\r'\$ | xargs perl -pi -e 's/\r\n/\n/g'

This finds all files recursively but excludes the '.git' directory. Then it checks whether it has dos line endings and if it does, converts them to unix. Without the ' | xargs perl...' part, it'll list the files with dos line endings.

Looks like Realtek is finally learning, only a couple of files this time :)

-3
01.09.2019, 02:51
2 ответа
find / -name 'dork*' ! -name '*.zip'

Необходимо использовать два -nameтеста. Один для сопоставления dork*и один для сопоставления *.zip. Второй из них следует инвертировать (на!)так, чтобы найденные имена не совпадали с ним. Между тестами всегда есть неявное И.

Делаем видимыми неявные И:

find / -name 'dork*' -a ! -name '*.zip'

Также используется не -стандартный синтаксис GNU:

find / -name 'dork*' -and -not -name '*.zip'

Чтобы игнорировать возникающие при этом ошибки, перенаправьте стандартный поток ошибок на /dev/nullс 2>/dev/nullв конце.

С помощью GNU findвместо этого вы можете не входить в каталоги, которые не доступны для чтения:

find / \( -type d -not -readable -prune \) -or \
       \( -name 'dork*' -not -name '*.zip' -print \)
3
28.01.2020, 05:18

Вы неправильно понимаете синтаксис выражения find. Я думаю, вы ожидаете, что тест -nameбудет обрабатывать "dork*" -and !"zip"как шаблон, который он ищет, но -nameожидает одну строку шаблона , а не какое-то выражение. Способ findразбирает это:(имя соответствуетdork*)и (!zip), при этом !zipявляется отдельным подвыражением от первичного -name. Но !zipне является допустимым выражением, поэтому вы получите сообщение об ошибке.

Вам нужно нечто большее, например (имя соответствуетdork*)и (имя не соответствует*.zip).

find /  -name "dork*" -and '!' -name "*.zip"

(-andна самом деле не нужен; Я оставил это здесь для ясности.)

Здесь я сделал несколько других исправлений. :Шаблон *.zip, потому что zipсоответствует только файлу с именем точно "zip".!отделен пробелом, так что findраспознает его как отдельный элемент, а не часть чего-то еще, и я выделил его -в кавычках, поэтому, если вы используете команду в интерактивном режиме, оболочка не будет попробуйте интерпретировать это как отсылку к истории.

Кстати, что происходит с 2>&1 andgrep -iv "не" `? Если вы пытаетесь отфильтровать сообщения об ошибках и используете bash (, а не какую-либо другую оболочку ), вы можете использовать подстановку команд, чтобы не смешивать потоки вывода и ошибок :

.
find /  -name "dork*" -and '!' -name "*.zip" 2> >(grep -iv "not" >&2)
1
28.01.2020, 05:18

Теги

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