Переименовать файлы в нескольких подкаталогах

Я хочу переименовать файл, присутствующий в нескольких подкаталогах, с помощью сценария bash.

мои файлы находятся в папках:

./ПапкаA/ABCD/ABCD_Something.ctl

./ПапкаA/EFGH/EFGH_Something.ctl

./ПапкаA/WXYZ/WXYZ_Something.ctl

Я хочу переименовать все файлы .ctl с тем же именем (name.ctl).

Я пробовал несколько команд, используя mv или rename, но не работал.

Работа из папки A:

найти . -name '*.ctl' -exec переименовать *.ctl name.ctl '{}' \;

or

для f в ./*/*.ctl; do mv "$f" "${f/*.ctl/имя .ctl}"; Выполнено

or

для f в $(find . -type f -name '*.ctl'); do mv $f $(echo "$f" | sed 's/*.ctl/name.ctl/'); Выполнено

Можете ли вы помочь мне с использованием bash?

Благодарность


person Nico64    schedule 20.03.2018    source источник


Ответы (2)


Вы можете сделать это с помощью одной строки:

find . -name *.ctl -exec sh -c 'mv "$1" `dirname "$1"`/name.ctl' x {} \;

x просто позволяет имени файла быть позиционным символом 1, а не 0, который (на мой взгляд) неправильно использовать в качестве параметра.

person mikea    schedule 20.03.2018

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

find . -name '*.ctl' | while read f; do
    dn=$(dirname "${f}")
    # remove the echo after you sanity check the output
    echo mv "${f}" "${dn}/name.ctl"
done

find должен получить все файлы, которые вы хотите, dirname получит только имя каталога, а mv выполнит переименование. Вы можете убрать кавычки, если уверены, что в именах никогда не будет пробелов.

person Stephen Newell    schedule 20.03.2018
comment
Это правильный ответ ... но люди будут ныть о том, что не перебирают вывод находки. :P Я гарантирую это. - person Matias Barrios; 20.03.2018
comment
Спасибо, я тоже пытался, но, как ни странно, мне было отказано в разрешении на создание обычного файла name.ctl? - person Nico64; 20.03.2018