У меня есть дерево каталогов, подобное следующему
$ 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
.
Я ищу лучшее предложение для этого рекурсивного программного переименования.