LINUX.ORG.RU

bash. find и список игнорирования.


0

1

бодрой ночи =)

гугли-гуглил и нагуглил такое решение: find ./ -type f -not \( -name *.o -or -name *.a -or -name Makefile \)

для моей задачи этот способ не подходит, ибо имею цель использовать запятую в качестве разделителя.

подскажите, каким образом такого можно добиться? пример: find ./ -type f -not -name *.o,*.a

благодарен.

★★★
Ответ на: комментарий от Slavaz

собственно нет, именно запятая не критична. можно еще точку-запятую использовать. тоже понятно будет 8)

а как в вашем примере можно в квадратных скобках указать еще и имя файла? или невозможно?

зы я ABS изучаю. задачи сам придумываю. так что Вы не удивляйтесь моему «хочу» :)

niXman ★★★
() автор топика
Ответ на: комментарий от Slavaz

на счет имени файла, уже вижу вариант. но тоже не подходит.

детали: у юзера спрашивается список расширений, через запятую(или точку-запятую). далее, предполагал что есть возможность в find передать эту строку после определенного ключа. но, т.к. такого ключа нет, все же предполагаю позволить юзеру вводить разделяя пробелом. в таком случае, я получу массив, и при помощи array replacement склею нужную строку...

niXman ★★★
() автор топика
Ответ на: комментарий от niXman

а как в вашем примере можно в квадратных скобках указать еще и имя файла? или невозможно?

В квадратных скобках никак, только одиночные буквы. Если надо перечисление имён файлов, то лучше использовать регулярные выражения:

find ./ -type f -regextype posix-extended -not -regex '.*/(FileName1|Filename2|Makefile)$'
тут в круглых скобках перечислены имена файлов через прямую черту '|'.

Slavaz ★★★★★
()
Ответ на: комментарий от Slavaz

в этом примере расширения перечислять одинаково с файлами тоже нельзя. ошибку получаю.

зы

эх.. регулярки еще учить надо %)

niXman ★★★
() автор топика
Ответ на: комментарий от niXman

можно, только нужно узнать, как именно расширения указываются. Не исключено, что формируется неправильная регулярка.
По идее, расширение указывается так: [^/]*\.ext$
то есть, в нашем случае будет:

find ./ -type f -regextype posix-extended -not -regex '.*/([^/]*\.ext|[^/]*\.ext|Makefile)$'

или упрощённо:
find ./ -type f -regextype posix-extended -not -regex '.*/.*\.ext|.*\.ext|Makefile)$'

осталось только правильно формировать регулярное выражение, экранируя ввод от пользователя :)

Slavaz ★★★★★
()
Ответ на: комментарий от Slavaz

у меня вот что получилось. даже без массива.

EXTS="*.o;*.a;Makefile"
find ./ -type f -not \( -name ${EXTS//";"/" -or -name "} \)

:)

niXman ★★★
() автор топика

Не думаю, что с запятой это вообще возможно, ведь она обозначает «И» а не «ИЛИ», а предыдущее выражение дискардится. Другие варианты: 1) find ./ -type f -not -name *.o -not -name *.a -not -name Makefile 2) find ./ -type f | sed /.o$/d | sed /.a$/ | sed /Makefile/d потом даже если на ввод приходит лист в виде запятых - можно всегда сделать замещение и eval и привести к нужному (вышеприведённому) виду

siberean
()
list='ollo, alala, somre[gex], whatever'
find . -type f -not \( -name ${list//,/-or name } \)

нутыпонел

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.