linux 有没有一种方法可以使用bash脚本将所有子目录名称小写?

91zkwejq  于 2023-01-20  发布在  Linux
关注(0)|答案(4)|浏览(122)

我正在尝试格式化旧文件以适应/合并到我们当前的数据集处理自动化中。然而,旧文件的目录和子目录名称都是大写的。
我不太清楚如何使用bash脚本来实现这一点。有没有办法将所有目录和子目录的名称改为小写?

x6yk4ghg

x6yk4ghg1#

如果您只想更改目录和子目录(即不更改文件),则应该使用find命令。
如果您使用的是bash v.4或更高版本,则可以在不调用bash本身以外的任何其他程序的情况下执行此操作:

$ find . -mindepth 1 -depth -type d -execdir bash -c \
    'mv -T "${0}" "${0,,}"' "{}" \;

(编辑以添加-T选项,请参见注解)。
否则,您需要通过其他方式转换目录名称,例如tr

$ find . -mindepth 1 -depth -type d -execdir bash -c \
    'mv -T "$0" "$(echo $0 | tr [:upper:] [:lower:])"' "{}" \;

(编辑以在路径周围添加双引号,如评论中所建议的那样)
请注意,您必须使用-depth,以便按 depth-first 顺序更改目录名(不要剪切您所在的分支)。
此外,您需要-execdir而不是-exec,以便一次只重命名一个path元素。

rfbsl7qr

rfbsl7qr2#

这可能会派上用场:

$ var=AAA
$ echo ${var,}
aAA
$ echo ${var,,}
aaa

以及上部:

$ var=aaa
$ echo ${var^}
Aaa
$ echo ${var^^}
AAA
n6lpvg4x

n6lpvg4x3#

tr可能会有所帮助,例如

echo HELLO | tr '[:upper:]' '[:lower:]'

因此,您可以执行类似于

for i in $(ls)
do
  mv $i $(echo $i | tr '[:upper:]' '[:lower:]')
done
deyfvvtc

deyfvvtc4#

一个纯粹的基于Bash查找的概念

基于Knut's solution,我建议您扩展到下面的代码片段并构建:

find . -maxdepth 1 -exec echo echo {} \| tr "[:upper:]" "[:lower:]" \;

find . -maxdepth 1 -exec echo mv {} \$\(echo {} \| tr "[:upper:]" "[:lower:]"\) \;

这将构建并向您展示创建小写命名文件夹所需的操作。您可以使用输出作为重命名脚本的模板,或者将其 Package 在一个重命名函数中。

同一命令的变体,具有更高的灵活性:

find .:句点将在您所在的本地目录中搜索。如果您想分析另一个文件夹,只需将圆点替换为该文件夹的路径。示例:$查找/路径/到/另一个 *
-最大深度1:这是find命令应该考虑的深度。1表示只应用于该文件夹的子文件夹(递归级别1)。-maxdepth 2* 表示进入每个子文件夹并做同样的操作(递归级别2)。

相关问题