Recursion 递归重命名文件夹

Recursion 递归重命名文件夹,recursion,sed,rename,Recursion,Sed,Rename,我有一个Windows备份程序,它正在创建大量的子目录,最后有一个“$”。同一备份程序的Linux客户端希望在目录名的末尾有一个“:”,以便还原文件夹。一些文件夹具有“$”功能,而其他文件夹则没有-这与内部版本控制系统有关 如果我要将一个文件从windows客户端恢复到另一个windows机箱,备份程序工作得很好。程序正在windows中使用“$”,因为“:”在路径中无效 我正在bash中寻找一个递归重命名,它将逐步通过一个路径找到所有文件夹,并在最后找到一个“$”字符,并将其替换为“:” 我的

我有一个Windows备份程序,它正在创建大量的子目录,最后有一个“
$
”。同一备份程序的Linux客户端希望在目录名的末尾有一个“
”,以便还原文件夹。一些文件夹具有“
$
”功能,而其他文件夹则没有-这与内部版本控制系统有关

如果我要将一个文件从windows客户端恢复到另一个windows机箱,备份程序工作得很好。程序正在windows中使用“
$
”,因为“
”在路径中无效

我正在bash中寻找一个递归重命名,它将逐步通过一个路径找到所有文件夹,并在最后找到一个“
$
”字符,并将其替换为“

我的测试数据如下:

./a$
./b$
./c$
./white space$
./white space$/another test$
./white space$/another test$/a$
./white space$/another test$/b$
./white space$/another test$/x
./white space$/another test$/y
./white space$/test
./white space$/test 2
./white space$/testing$
我试过:

find . -type d -name "*$" 
这给了我一个需要重命名的文件夹列表

./a$
./b$
./c$
./white space$
./white space$/another test$
./white space$/another test$/a$
./white space$/another test$/b$
./white space$/testing$


find . -type d -name "*$" | sed 's/$$/\:/'   
给了我我想要的最终结果

./a:
./b:
./c:
./white space:
./white space$/another test:
./white space$/another test$/a:
./white space$/another test$/b:
./white space$/testing:
但我不能让它在同一步重命名。另外,我需要它以相反的顺序工作(从最深的匹配开始,向后工作),以便第一次重命名不会使其余的失败。

您可以使用来处理所有空格和特殊字符,然后使用
printf“%d”
您可以获得每个匹配目录的深度,然后执行降序
排序
,并通过
awk
构建一个
重命名
命令,以便与
sh
一起执行:

while IFS= read -r -d '' n; do
  printf '%q\n' "$n"
done < <(find . -type d -name "*$" -printf '%d|' -print0) | \
sort -r -k1 | \
awk -F '|' '{ printf "rename -v -n '\''s/\\$$/:/'\'' %s \n",$2 }' | \
sh
显示进度 可供替代的 更简单的解决方案是使用批量重命名工具:

rnm -rs '/\$$/:/g' -dp -1 *
您可以使用来处理所有空格和特殊字符,然后使用
printf“%d”
可以获得每个匹配目录的深度,然后执行降序
排序
,并通过
awk
构建
重命名
命令,以便使用
sh
执行:

while IFS= read -r -d '' n; do
  printf '%q\n' "$n"
done < <(find . -type d -name "*$" -printf '%d|' -print0) | \
sort -r -k1 | \
awk -F '|' '{ printf "rename -v -n '\''s/\\$$/:/'\'' %s \n",$2 }' | \
sh
显示进度 可供替代的 更简单的解决方案是使用批量重命名工具:

rnm -rs '/\$$/:/g' -dp -1 *

很高兴为您提供帮助,如果您的问题得到解决,您可以接受答案。我今天早上在我的生产数据上运行了它,它在第一次运行时遍历并重命名了大约90%的文件夹,但在某些地方它必须重命名树中的基本文件夹,因为找不到大约300个文件夹。第二次运行脚本解决了这个问题。想知道是否有方法在重命名时输出进度?您是否第一次使用
-n
运行以查看受影响的目录列表,是否登记了丢失的文件夹?我已经在我的帖子中添加了progression功能。很高兴能够帮助您,如果您的问题得到解决,您可以接受答案。我今天早上在我的生产数据上运行了progression功能,它在第一次运行时遍历并重命名了大约90%的文件夹,但在某些地方它必须重命名树中的基本文件夹,因为找不到大约300个文件夹。第二次运行脚本解决了这个问题。想知道是否有方法在重命名时输出进度?您是否第一次使用
-n
运行以查看受影响的目录列表,是否登记了丢失的文件夹?我已经在我的帖子中添加了渐进功能
rnm -rs '/\$$/:/g' -dp -1 *