найти все директории с именем X и переименовать имя на Y

Тема в разделе "Администрирование серверов", создана пользователем ufaclub, 9 окт 2015.

Метки:
Модераторы: mefish, stooper
  1. ufaclub

    ufaclub

    Регистр.:
    1 май 2007
    Сообщения:
    394
    Симпатии:
    17
    искать папки register нужно в папке /var/www (их будет много)

    т.е найти папку register и переименовать ее в stopregister

    команда нужна для SHH на CentrOS


    в корне положил файл файл rename.sh

    #!/bin/bash
    #Begin rename.sh

    mv $1 `dirname $1`/stopregister

    #end rename.sh

    потом через shh делаю команду

    find /var/www -type d -name "register" -exec rename.sh {} \;


    в ответ получаю много строк с содержанием

    find: `rename.sh': No such file or directory
    find: `rename.sh': No such file or directory
    find: `rename.sh': No such file or directory
    .............
    find: `rename.sh': No such file or directory

    в чем моя ошибка?






    пишет что
     
  2. mrLom

    mrLom ♒︎

    Moderator
    Регистр.:
    24 дек 2014
    Сообщения:
    822
    Симпатии:
    1.401
    Код:
    find . -depth -name "register" -exec bash -c 'for f; do base=${f##*/}; mv -- "$f" "${f%/*}/${base//register/stopregister}"; done' _ {} +
    UP. Хотя данная команда поменяет не только папки, но и файлы..
    Нужно пооперировать с ключами, в поиске добавим -type d
     
    Последнее редактирование: 9 окт 2015
    Renny нравится это.
  3. Renny

    Renny Создатель

    Регистр.:
    3 авг 2014
    Сообщения:
    24
    Симпатии:
    447
    -exec rename.sh
    Скорее всего нужно указывать полный путь к скрипту, например:
    -exec /var/www/rename.sh

    И право выполнения дать chmod +x rename.sh
     
  4. mrLom

    mrLom ♒︎

    Moderator
    Регистр.:
    24 дек 2014
    Сообщения:
    822
    Симпатии:
    1.401
    Только все равно, данная команда выполнит замену только первой корневой папки, дальше вглубь поиск не продолжится.
    Типо результат: /register/register/register/ — /stopregister/register/register/
     
  5. ufaclub

    ufaclub

    Регистр.:
    1 май 2007
    Сообщения:
    394
    Симпатии:
    17
    find . -depth -name "register" -exec bash -c 'for f; do base=${f##*/}; mv -- "$f" "${f%/*}/${base//register/stopregister}"; done' _ {} +

    сработало.

    я так понял если добавить после find /var/www

    find /var/www -depth -name "register" -exec bash -c 'for f; do base=${f##*/}; mv -- "$f" "${f%/*}/${base//register/stopregister}"; done' _ {} +

    то он будет искать только глубже папки /var/www
     
  6. mrLom

    mrLom ♒︎

    Moderator
    Регистр.:
    24 дек 2014
    Сообщения:
    822
    Симпатии:
    1.401
    Да, верно.
    . — ищет от текущей папки, указывая путь, ищет от указываемого пути.