我想重命名所有文件夹及其内部的文件夹,使文件夹名称中所有下划线都替换为空格。您能帮我吗?
使用-execdir
的答案更简单,但只适用于支持-execdir
的find
版本,如GNU find,因为POSIX仅指定-exec
。
如果您只想使用bash,这似乎非常棘手,因为您要重命名find
正在搜索的目录。即使通过使用-depth
选项对find
进行排序,您也需要确保每个-exec
仅重新编写路径的最后一个组件。以下是Bash FAQ中给出的示例之一的微小变化,对我来说似乎工作正常:
find . -depth -name "*_*" -exec bash -c 'dir=${1%/*} base=${1##*/}; mv "$1" "$dir/${base//_/ }"' _ {} \;
find . -depth -name "*_*" -exec bash -c [SOME-STUFF] _ {} \;
[SOME-STUFF]
,将参数0设置为_
(表示我们不关心它),将参数1设置为find找到的文件名。(find
会在-exec
之后用文件名替换{}
。\;
只是终止-exec
运行的命令。)
然后[SOME-STUFF]
部分由以下内容组成:
dir=${1%/*}
...这部分使用参数展开,将从$1
(文件名)的结尾删除最短匹配的/*
,并将dir
设置为结果。同样,这部分内容:
base=${1##*/}
该函数从$1
的开头删除最长匹配的*/
并将base
设置为结果。 因此,base
只是路径的最后一个组成部分。
然后重命名实际上是由mv
命令完成的,其格式如下:
mv "$1" "$dir/${base//_/ }"
${parameter/pattern/string}
语法。文件名($1
)被重命名为 $dir
加上 $base
,但是在 $base
中的每个下划线都被替换成一个空格。是的,只需cd到/dir并执行以下操作:
find -depth -type d -execdir rename 's/_/ /g' {} \;
file $(type -p rename)
输出包含ELF,看起来不太好 ;)
编辑 添加了-depth和-execdir选项
find
找到'foo_bar/baz_quux'之前,'foo_bar'就会被找到并重命名,当尝试重命名后者时,它将无法找到。 - Mark Longairrename 's/_/ /' ./foo_bar/bar_baz
,它会给出错误Can't rename ./foo_bar/bar_baz ./foo bar/bar_baz: No such file or directory
- 如果您正在使用rename
,则需要一个正则表达式,它只会替换路径中最后一个组件中的下划线。 - Mark Longair-execdir
而不是-exec
。 - Manny Ds/_/ /g
。 - Mark Longairfor i in **; do [[ -d "$i" ]] || continue; mv "$i" "${i/_/ }"; done