我想这些文件夹重命名内我的所有文件夹和文件夹,以便在文件夹名称中的所有下划线用空格代替。你能帮助我吗?bash脚本来重命名文件夹递归
回答
是的,只是cd到/目录和:
find -depth -type d -execdir rename 's/_/ /g' {} \;
根据不同的发行版,你需要perl的重命名(有时女士prename)。
如果
file $(type -p rename)
输出包含ELF,看起来不好;)
编辑 -depth和-execdir加入
使用-execdir
是简单的答案,而只是会与支持-execdir
的版本find
一起工作,如GNU查找,因为POSIX only specifies -exec
。
如果你只是想使用bash,这是令人惊讶的棘手,因为你正在重命名目录find
正在通过搜索。即使你获得订单的权利,通过-depth
选项find
,你需要确保你只改写了路径的最后一个组件,每个-exec
。以下是one of the examples given in the Bash FAQ一个微不足道的变化,似乎为我工作确定:
find . -depth -name "*_*" -exec bash -c 'dir=${1%/*} base=${1##*/}; mv "$1" "$dir/${base//_/ }"' _ {} \;
这常见问题回答了有关递归命名的文件夹可能会感兴趣的问题进行更多的讨论。
更新:由于一个班轮是相当复杂的,它可能是值得打破下来一点点在解释的利益。本质上,find
命令是:
find . -depth -name "*_*" -exec bash -c [SOME-STUFF] _ {} \;
换句话说,发现所有这些包含下划线,并且对于每个这样的目录,从最深的目录,作为_
运行bash脚本[SOME-STUFF]
,具有参数0(以表明我们不关心它)和参数1作为找到的文件的名称。 (find
将-exec
后取代{}
文件名中的\;
刚刚结束的命令-exec
运行。)
然后[SOME-STUFF]
部分组成:
dir=${1%/*}
...其中,使用parameter expansion,将从$1
(文件名)的末尾删除/*
的最短匹配并将dir
设置为结果。同样,这一部分:
base=${1##*/}
...从$1
开始删除的*/
最长匹配,并设置base
的结果。所以base
只是路径的最后一个组件。
mv "$1" "$dir/${base//_/ }"
这再次使用参数扩展,此时用${parameter/pattern/string}
语法:
然后更名实际上是由mv
命令,这是完成。文件名($1
)被重命名为$dir
,后面跟着$base
,但是每个下划线在$base
被替换为一个空格。
如果您希望替换值(本例中为空格)是源自调用脚本的变量,该怎么办?在前。我已经包含$ SOMEVAR不起作用。找 。 -depth -name“* _ *”-exec bash -c'dir = $ {1%/ *} base = $ {1 ## * /}; mv“$ 1”“$ dir/$ {base // _/$ SOMEVAR}”'_ {} \; –
如果你有bash4,你可以运行:
for i in **; do [[ -d "$i" ]] || continue; mv "$i" "${i/_/ }"; done
- 1. bash脚本来重命名文件夹
- 2. 如何通过bash脚本递归地重命名文件?
- 3. bash脚本未能与日期来重命名文件夹
- 4. 递归BASH重命名
- 5. bash脚本优化文件重命名
- 6. 使用bash脚本重命名文件
- 7. 以相反顺序递归重命名目录,Bash脚本
- 8. 在某个目录中递归地重命名某些文件 - Shell/Bash脚本
- 9. 如何从Bash递归重命名文件和文件夹与iconv
- 10. 重命名文件夹名称中的文件引起的Bash脚本问题
- 11. Python脚本递归地重命名文件夹和子文件夹中的所有文件
- 12. 重命名文件夹和文件在Windows系统递归
- 13. Bash重命名扩展递归
- 14. 递归重命名的文件夹名称
- 15. Bash:复制+重命名文件夹
- 16. 在bash脚本中重命名文件打破脚本
- 17. 使用批处理脚本递归地重命名文件夹和子文件夹
- 18. 在bash中重命名文件夹,文件和子文件夹
- 19. Bash:递归复制和重命名文件
- 20. bash脚本复制无名文件夹
- 21. bash脚本在子文件夹中的多个文件重命名为自己的文件夹名称
- 22. 递归删除文件夹但排除命名文件夹
- 23. Powershell递归重命名文件,而不是重命名重复
- 24. Bash脚本用动态名称重命名文件夹并将其替换为
- 25. 使用find递归获取bash脚本的文件名
- 26. Bash脚本递归地更改文件名
- 27. Bash脚本根据部分文件名将文件归档到文件夹中
- 28. 将文件夹名重命名为带有bash的文件名
- 29. 递归重命名文件Mac OSX
- 30. python中的递归文件重命名
这不会起作用,因为“foo_bar这样的名称”会被发现之前更名为“foo_bar这样的名称/ baz_quux”是'find'输出 - 后者不会在尝试重命名时找到。 –
没什么大不了的,您可以添加'-depth'开关来查找。 –
是的,-depth加入了;) –