Трубынные файлы для ZMV

Используя awk , вы можете сделать следующее:

ovs-ofctl show br-int | awk '/5.tap/ || /5.qvo/'

или

ovs-ofctl show br-int | awk '/5.(tap|qvo)/'
4
04.08.2018, 19:38
2 ответа

Я мысленно работаю так же, как и вы, но предпочитаю наслаивать grepкоманды до конца. Трудно сопротивляться побуждению, но в таких ситуациях вы должны или мысленно помнить, что когда вы хотите начать действовать по списку, исходящему от find |..., вы должны начать тянуть xargs. Когда вы дойдете до этого момента, пора переключиться на find <regex> -exec....

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

$ find. ! -name "*TFLM*" -exec zmv "{}" "TFLM {}" \;

Но это не сработает, судя по комментариям @StephaneChazelas:

Since zmv is a zsh function, it cannot be executed directly by find. Even if one made a standalone script wrapper around zmv, calling it like that as -exec zmv "{}"... wouldn't make much sense (completely defeat the purpose of zmv) and would introduce a command injection vulnerability

Таким образом, у вас остаются более традиционные варианты использования одного из методов, показанных в этом вопросе и ответе U&L под названием:Пакетное переименование файлов .

Или используя zmvнепосредственно для переименования. Поскольку вы используете zshи zmv, скорее всего, вам вообще не понадобится помощь find.

$ zmv "(^*TFLM*)" "TFLM \$1"

ПРИМЕЧАНИЕ.:Примите мой совет относительно zmvи zshс долей скептицизма. На самом деле я не использую Zsh, обычно я весь день сижу в Bash.

Ссылки

2
27.01.2020, 20:46

То, что вы делаете, не соответствует тому, как должны работать find, grepи zmv. Прежде всего, вы используете findдля поиска файлов, а затем grepдля шаблона; это не имеет никакого смысла. В команду findвстроено -сопоставление с образцом, например, в GNU find, начиная с базового -nameи заканчивая -iname, -path, -regexи многими другими. Вы даже можете изменить синтаксис регулярного выражения, если хотите, с помощью -regextype. Дело не только в том, что вы делаете что-то не быстро или задействовано слишком много команд, что еще хуже, ваша команда подвержена ошибкам, например, если в файле есть место внутри.

Гораздо лучше чистый findс опцией -exec, за которой следует внешняя команда, например mv. При некоторой осторожности это решение может быть очень переносимым между различными системами.

Но, поскольку вы используете zsh, то он напрашивается на использование всей его красоты, так что просто добавьте опцию -vnк zmvи поэкспериментируйте с разными паттернами, скорее всего, вы захотите

zmv -vn '(^(*TFLM*))' 'TFLM $1'

-vозначает подробный и -nпредотвращает выполнение, просто печатает то, что должно быть сделано (это отлично подходит для тестирования ).

5
27.01.2020, 20:46

Теги

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