我正在尝试格式化旧文件以适应/合并到我们当前的数据集处理自动化中。然而,旧文件的目录和子目录名称都是大写的。我不太清楚如何使用bash脚本来实现这一点。有没有办法将所有目录和子目录的名称改为小写?
x6yk4ghg1#
如果您只想更改目录和子目录(即不更改文件),则应该使用find命令。如果您使用的是bash v.4或更高版本,则可以在不调用bash本身以外的任何其他程序的情况下执行此操作:
find
$ find . -mindepth 1 -depth -type d -execdir bash -c \ 'mv -T "${0}" "${0,,}"' "{}" \;
(编辑以添加-T选项,请参见注解)。否则,您需要通过其他方式转换目录名称,例如tr:
-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元素。
-depth
-execdir
-exec
rfbsl7qr2#
这可能会派上用场:
$ var=AAA $ echo ${var,} aAA $ echo ${var,,} aaa
以及上部:
$ var=aaa $ echo ${var^} Aaa $ echo ${var^^} AAA
n6lpvg4x3#
tr可能会有所帮助,例如
echo HELLO | tr '[:upper:]' '[:lower:]'
因此,您可以执行类似于
for i in $(ls) do mv $i $(echo $i | tr '[:upper:]' '[:lower:]') done
deyfvvtc4#
基于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)。
4条答案
按热度按时间x6yk4ghg1#
如果您只想更改目录和子目录(即不更改文件),则应该使用
find
命令。如果您使用的是bash v.4或更高版本,则可以在不调用bash本身以外的任何其他程序的情况下执行此操作:
(编辑以添加
-T
选项,请参见注解)。否则,您需要通过其他方式转换目录名称,例如
tr
:(编辑以在路径周围添加双引号,如评论中所建议的那样)
请注意,您必须使用
-depth
,以便按 depth-first 顺序更改目录名(不要剪切您所在的分支)。此外,您需要
-execdir
而不是-exec
,以便一次只重命名一个path元素。rfbsl7qr2#
这可能会派上用场:
以及上部:
n6lpvg4x3#
tr
可能会有所帮助,例如因此,您可以执行类似于
deyfvvtc4#
一个纯粹的基于Bash查找的概念
基于Knut's solution,我建议您扩展到下面的代码片段并构建:
这将构建并向您展示创建小写命名文件夹所需的操作。您可以使用输出作为重命名脚本的模板,或者将其 Package 在一个重命名函数中。
同一命令的变体,具有更高的灵活性:
find .:句点将在您所在的本地目录中搜索。如果您想分析另一个文件夹,只需将圆点替换为该文件夹的路径。示例:$查找/路径/到/另一个 *
-最大深度1:这是find命令应该考虑的深度。1表示只应用于该文件夹的子文件夹(递归级别1)。-maxdepth 2* 表示进入每个子文件夹并做同样的操作(递归级别2)。