Как рекурсивно переименовывать каталоги и файлы с несколькими совпадениями на полных путях. - PullRequest
0 голосов
/ 02 ноября 2018

У меня есть дерево каталогов, подобное следующему

$ tree -F
.
├── old_value/
│   ├── old_value.py
│   ├── old_value_subdir/
│   │   └── old_value_file
│   ├── other_value.py
│   └── other_value_subdir/
│       └── old_value_file
└── old_value.py

Я хотел бы заменить old_value на new_value в именах каталогов и файлов. В конце это должно выглядеть так:

.
├── new_value/
│   ├── new_value.py
│   ├── new_value_subdir/
│   │   └── new_value_file
│   ├── other_value.py
│   └── other_value_subdir/
│       └── new_value_file
└── new_value.py

Было множество похожих ответов, предлагающих комбинацию find -exec, xargs, rename и mv с рисунками. (1) , (2) , (3) . Я не смог найти разумного упоминания путей, соответствующих одной и той же строке на нескольких уровнях каталогов. Например

./old_value
./old_value/old_value_subdir
./old_value/old_value_subdir/old_value_file

Если я пытаюсь переименовать их в порядке их перечисления, я получаю эту ошибку

$ find . -name "*"  | xargs -n 1 rename -v  's/old_value/new_value/g'
'./old_value' renamed to './new_value'
Can't rename './old_value/old_value_subdir' to './new_value/new_value_subdir': No such file or directory
Can't rename './old_value/old_value_subdir/old_value_file' to './new_value/new_value_subdir/new_value_file': No such file or directory

Обратный порядок также проблематичен.

$ find . -name "*" | tail -r  | xargs -n 1 rename -v  's/old_value/new_value/g'
Can't rename './old_value/old_value_subdir/old_value_file' to './new_value/new_value_subdir/new_value_file': No such file or directory
Can't rename './old_value/old_value_subdir' to './new_value/new_value_subdir': No such file or directory
'./old_value' renamed to './new_value'

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

Я ищу лучшее предложение для этого рекурсивного программного переименования.

...