2013-12-11 4 views
1

Я хочу переименовать все папки .hg_gg в /var/www по номеру .hg. Как мне это сделать? Я знаю, как переименовать .hg в .hg_gg.Linux найти папку и переименовать

find /var/www -name ".hg" -exec bash -c 'mv $0 $0_gg' {} \; 

но не знаю, как сделать обратное изменение.

+0

Можете ли вы привести несколько примеров этих папок? – anubhava

+0

Я хочу переименовать /var/www/test/.hg_gg/ в /var/www/test/.hg/ – freento

ответ

7

Попробуйте это:

find /var/www -name ".hg_gg" -execdir bash -c 'mv {} .hg' \; 

Вам нужно использовать специальный синтаксис, определенный находкой: {} является заполнителем для текущего имени файла. Проверьте это на man page. Также важно вместо -exec. execdir изменяет текущий рабочий каталог на папку, в которой находится найденная директория. В противном случае это будет делать что-то вроде этого mv /var/www/.hg_gg ./.hg

Вы можете ускорить вещи немного, когда ограничение поиска, чтобы найти папки только с помощью -type d:

find /var/www -type d -name ".hg_gg" -execdir bash -c 'mv {} .hg' \; 
+0

Я верю, что OP хочет обратить вспять это – anubhava

+0

Да, он говорит, но он показывает другой код .. Я не что он хочет. Я надеюсь, что, по крайней мере, он это сделал.;) Обновил код – hek2mgl

+0

. Mv: не может перемещать '/var/www/test/.hg_gg 'в .hg/.hg_gg: Directory not empty – freento

3

Не один лайнер, но вы могли бы сделать это:

for file in `find /var/www -name ".hg_gg"`; do 
    mv $file `echo $file | sed 's/hg_gg$/hg/'` 
done 
+0

Я бы сделал [-d] тест, чтобы подтвердить, что файл является каталогом до вызова mv. – selbie

4

Рассмотрим это найти команду с -execdir-prune и опции:

find /var/www/ -type d -name ".hg_gg" -execdir mv '{}' '.gg' \; -prune 
  • -execdir выполнит команду в каждом подкаталоге
  • -prune причины найти не спускаться в текущий файл
+0

PS: Обратите внимание, что без опции '-prune' вы получите такие ошибки, как' ./.hg_gg: нет такого файла или каталога' – anubhava

Смежные вопросы