我必须递归地重命名一个完整的文件夹树,这样就不会出现任何大写字母(它是C++源代码,但这无关紧要).忽略CVS和SVN控制文件/文件夹的加分点.首选方法是shell脚本,因为shell应该可以在任何Linux机器上使用.
关于文件重命名的细节有一些有效的论据.
我认为应该覆盖具有相同小写名称的文件,这是用户的问题.当检出案例忽略文件时,系统也会用后者覆盖第一个文件系统.
我会考虑AZ字符并将它们转换为az,其他一切只是要求问题(至少使用源代码).
在Linux系统上运行构建需要脚本,因此我认为应该省略对CVS或SVN控制文件的更改.毕竟,这只是一个划痕结账.也许"出口"更合适.
tristanbaile.. 247
更小仍然我很喜欢
rename 'y/A-Z/a-z/' *
在不区分大小写的文件系统(如OS X的HFS +)上,您需要添加-f标志
rename -f 'y/A-Z/a-z/' *
+1.这个确切的例子在重命名的手册页中给出. (8认同)
在Arch上,该程序被称为`perl-rename`(由具有相同名称的包提供) (8认同)
这假设你有perls重命名,但并非总是如此.例如,我的debian重命名是完全不同的 (4认同)
http://linux.icydog.net/rename.php:`Ubuntu默认使用的重命名实用程序是Perl程序,有时称为prename. (3认同)
由于"重命名"不是递归的,因此这不能解决给定的问题. (2认同)
Alex B.. 166
使用"rename"
命令的简洁版本.
find my_root_dir -depth -exec rename 's/(.*)\/([^\/]*)/$1\/\L$2/' {} \;
这避免了在文件之前重命名目录并尝试将文件移动到不存在的目录(例如,"A/A"
进入"a/a"
)的问题.
或者,更详细的版本没有使用"rename"
.
for SRC in `find my_root_dir -depth` do DST=`dirname "${SRC}"`/`basename "${SRC}" | tr '[A-Z]' '[a-z]'` if [ "${SRC}" != "${DST}" ] then [ ! -e "${DST}" ] && mv -T "${SRC}" "${DST}" || echo "${SRC} was not renamed" fi done
PS
后者允许移动命令更灵活(例如"svn mv"
).
更小仍然我很喜欢
rename 'y/A-Z/a-z/' *
在不区分大小写的文件系统(如OS X的HFS +)上,您需要添加-f标志
rename -f 'y/A-Z/a-z/' *
使用"rename"
命令的简洁版本.
find my_root_dir -depth -exec rename 's/(.*)\/([^\/]*)/$1\/\L$2/' {} \;
这避免了在文件之前重命名目录并尝试将文件移动到不存在的目录(例如,"A/A"
进入"a/a"
)的问题.
或者,更详细的版本没有使用"rename"
.
for SRC in `find my_root_dir -depth` do DST=`dirname "${SRC}"`/`basename "${SRC}" | tr '[A-Z]' '[a-z]'` if [ "${SRC}" != "${DST}" ] then [ ! -e "${DST}" ] && mv -T "${SRC}" "${DST}" || echo "${SRC} was not renamed" fi done
PS
后者允许移动命令更灵活(例如"svn mv"
).
for f in `find`; do mv -v "$f" "`echo $f | tr '[A-Z]' '[a-z]'`"; done
如果您不需要关心效率,只需尝试按照即可.
zip -r foo.zip foo/* unzip -LL foo.zip
上面的大多数答案都很危险,因为它们不处理包含奇数字符的名称.对于这类事情,你最安全的选择是使用find的-print0选项,它将使用ascii NUL而不是\n来终止文件名.在这里,我提交了这个脚本,它只改变文件而不是目录名,以免混淆find.
find . -type f -print0 | xargs -0n 1 bash -c \ 's=$(dirname "$0")/$(basename "$0"); d=$(dirname "$0")/$(basename "$0"|tr "[A-Z]" "[a-z]"); mv -f "$s" "$d"'
我测试了它,它适用于包含空格,各种引号等的文件名.这很重要,因为如果你以root身份运行树上包含由以下内容创建的文件的其他脚本之一:
touch \;\ echo\ hacker::0:0:hacker:\$\'\057\'root:\$\'\057\'bin\$\'\057\'bash
......好吧猜猜......
男人,你们喜欢复杂的事情..
重命名'y/AZ/az /'*
如果您已经拥有或设置了重命名命令(例如通过Mac中的brew安装),则此方法有效:
rename --lower-case --force somedir/*
这适用于没有rename
Perl脚本的CentOS/Redhat或其他发行版:
for i in $( ls | grep [A-Z] ); do mv -i "$i" "`echo $i | tr 'A-Z' 'a-z'`"; done
来源:https://linuxconfig.org/rename-all-files-from-uppercase-to-lowercase-characters
(在某些发行版中,默认rename
命令来自util-linux,这是一个不同的,不兼容的工具)