Intereting Posts
Что делает sed $ ‘s / \ t] // g’? sed – не добавляет новую строку EOF и заменяет букву не определенной Как grep рекурсивные результаты дерева UNIX вместе с каждым узлом дерева? Как навсегда переделать кепку в esc в X11? Команда sudo не работает, когда strace прилагается с PID bash Не удается удалить сломанную символическую ссылку Есть ли способ иметь одну строку конкретного кода ksh внутри файла bash? Можно ли сортировать сортировку? Как вы автоматически повышаете автоматическую задачу до привилегий root или существует альтернативный подход? Как использовать ls, используя длинный формат (-l), в то же время следуя символическим ссылкам каталога? Не удается создать клиентский сертификат после того, как я стал его собственным центром сертификации Заменить текст / строку новой строкой Вложение Awk и сравнение переменных Пакеты прошивок: что они на самом деле делают? Загрузка нового драйвера wlan

удаление подстроки в find -exec

Когда используешь

$ find . -name string~ -exec cp {} FOO \; 

есть способ использовать {} в FOO для удаления символа тильды, как мы обычно делаем с подстроками bash

например:

  $ echo ${string%substring} 

Я пытаюсь скопировать файлы с именем string ~ в строку (противоположно $ find . -name string -exec cp {} {}~ \; ).

Это случай, когда вы должны наполнить выполнение кода в порожденную оболочку.

 find . -name '*~' -exec sh -c 'cp "$0" "${0%~}"' {} \; 

Таким образом, вам не нужно писать сценарий. Вы просто делаете это в одном лайнере.


Примечание. Для cp здесь не нужен спецификатор «end of options», так как find будет префикс файлов, найденных с помощью ./ , что не позволит их разобрать как параметры для cp .

(Исключение из этого префикса ./ если текущий каталог сам «найден», но, конечно, это имя не заканчивается тильдой, и оно не может быть ошибочно принято как флаг опции.)


Я бы даже использовал порожденную оболочку для добавления тильды к имени копии; другими словами, я бы использовал:

 find . -name string -exec sh -c 'cp "$1" "$1"~' find-sh {} \; 

в предпочтении:

 find . -name string -exec cp {} {}~ \; # Don't use this! 

поскольку последний не указан POSIX и поэтому неспособен.

Из спецификаций POSIX для find :

Если строка utility_name или аргумент содержит два символа «{}», но не только два символа «{}», это определяется реализацией, заменяет ли find эти два символа или использует строку без изменений.

… Если присутствует более одного аргумента, содержащего два символа «{}», поведение не указано.