4

У меня есть структура каталогов, как это:

./
  whatever/
    foos_whatever.ext
  something/
    foo/
      1.ext
      2.ext
  another/
    foo.ext

Я хочу переименовать все файлы и каталоги, которые содержат foo . Я хотел бы заменить foo на bar .

Вот что я пытаюсь:

[naomi ~/app]$ find . -name '*foo*' -exec f={} && mv -v f ${f/foo/bar} \;

Это ошибка, которую я получаю:

find: -exec: no terminating ";" or "+"

Спасибо за любую помощь:D

2 ответа2

2

Очевидный способ, которым я думаю, что вы будете этим:

find -name "*foo*" -exec rename s/foo/bar/ {} \;

или с помощью xargs, если у вас много файлов для переименования:

find -name "*foo*" | xargs -I '{}' rename s/foo/bar/ '{}'

Однако проблема в том, что если у вас есть структура каталогов, которая выглядит примерно так:

.
|-- fooDir
|   |-- foo.txt
|   `-- abc
`-- foo2

Он не сможет переименовать foo.txt, потому что сначала он переименует fooDir в barDir, а затем заявит, что больше не находит «fooDir /foo.txt»

Просто повторите команду, пока у вас не возникнет ошибка, но она небрежная. Другим способом было бы запустить команду в цикле, один раз для каждого уровня глубины дерева каталогов, с параметрами find -mindepth и -maxdepth установленными для исключения других уровней, но тогда вы должны знать глубину вашей системы каталогов ,

Я не могу придумать лучшего способа.

2

Вы не можете использовать такие цепочки команд в -exec , так как оболочка интерпретирует их как продолжение самой find . Либо запустите цепочку в подоболочке, либо используйте rename или prename для переименования файла.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .