将整个目录树更改为小写名称

use*_*394 14 shell case-sensitivity

我正在处理网站转换。从 Web 服务器链接和提供的文件不区分大小写。但是,我已经在我的 linux 系统上制作了该站点的转储,并且我正在编写脚本来迁移数据。问题是我在页面中的链接字符串和文件系统上的实际单词大小写之间遇到了区分大小写的问题。

例如,一个页面可能有一个链接,<a href='/subfolder/PageName.asp'>而实际文件是/subfolder/pagename.asp. 同样的图像 -<img src='spacer_sm.gif'>可能是Spacer_Sm.gif.

所以我的想法是将所有目录和文件名更改为站点下载的小写等效项。我该怎么做(可能有更好的方法吗?)

即使有不区分大小写开关的 unix 命令,我使用的是 php,所以并不是所有的文件系统命令都有区分大小写的选项。

Gil*_*il' 9

Zsh

zmv -o-i '(**/)(*)' '$1${2:l}'
Run Code Online (Sandbox Code Playgroud)

说明:zmv根据给定的替换文本重命名匹配模式的文件。-o-i-i选项传递给mv引擎盖下的每个命令(见下文)。在替换文本中$1$2、 等是模式中连续的括号组。**递归地表示所有(子)*目录。最后(/)一个不是带括号的组,而是一个全局限定符,意思是只匹配目录。${2:l}转换$2为小写。

Perl 重命名

在这里,我使用 Debian 和 Ubuntu/usr/bin/prename提供的 Perl 重命名脚本(通常也可用rename)。使用 bash ?4 或 zsh:

shopt -s globstar  # only in bash
rename 's!/([^/]*/?)$!\L/$1!' **/*
Run Code Online (Sandbox Code Playgroud)

与其他贝壳:

find . -depth -exec rename -n 's!/([^/]*/?)$!\L/$1!' {} +
Run Code Online (Sandbox Code Playgroud)

便携的

递归地:

find . -depth -exec sh -c '
    t=${0%/*}/$(printf %s "${0##*/}" | tr "[:upper:]" "[:lower:]");
    [ "$t" = "$0" ] || mv -i "$0" "$t"
' {} \;
Run Code Online (Sandbox Code Playgroud)

的使用-depth确保在它们的祖先之前处理深层嵌套的目录。


use*_*own 8

我不知道你的 unix-flavor 是否有rename. 如果您搜索存储库,许多 Linux 都有,并且它是 perl 包的一部分。

find ./ -depth -exec rename -n 'y/[A-Z]/[a-z]/' {} ";"
Run Code Online (Sandbox Code Playgroud)

以上版本与

rename -n 
Run Code Online (Sandbox Code Playgroud)

并没有真正执行操作,而只是打印将要执行的操作。你省略 -n 来真正做到这一点。