如何在完整路径上具有多个匹配项的情况下以递归方式重命名目录和文件。

时间:2018-11-02 17:13:21

标签: bash shell scripting rename mv

我有一个类似以下的目录树

$ 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 -execxargsrenamemv与模式的组合。 (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和{{1 }}参数添加到-maxdepth

我正在寻找更好的建议来执行此递归程序化重命名。

0 个答案:

没有答案