ubuntu重命名文件夹 - 如何在Linux上将所有文件夹和文件重命名为小写?




ubuntu更改文件名称 (16)

Slugify Rename(正则表达式)

不完全是OP要求的,但我希望在此页面上找到的是:

重新命名文件的“slugify”版本,因此它们与URL类似
(即只包含字母数字,点和破折号):

rename "s/[^a-zA-Z0-9\.]+/-/g" filename

我必须递归地重命名一个完整的文件夹树,以便任何地方都不会出现大写字母(它是C ++源代码,但这应该不重要)。 用于忽略CVS和SVN控制文件/文件夹的奖励点数。 首选的方式将是一个shell脚本,因为shell应该可以在任何Linux机器上使用。

关于文件重命名的细节有一些有效的参数。

  1. 我认为具有相同小写名字的文件应该被覆盖,这是用户的问题。 在忽略文件系统的情况下检出时,也会用后者覆盖第一个文件系统。

  2. 我会考虑AZ字符并将它们转换为az,其他所有内容都只是调用问题(至少在源代码中)。

  3. 该脚本需要在Linux系统上运行构建,因此我认为应该省略对CVS或SVN控制文件的更改。 毕竟,这只是一个划痕结账。 也许一个“出口”更合适。


上面的大多数答案都是危险的,因为它们不处理包含奇数字符的名称。 你最安全的选择就是使用find的-print0选项,它将以ascii NUL而不是\ n结尾文件名。 在这里我提交这个脚本,它只改变文件而不改变目录名,以免混淆查找。

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

...猜猜看是什么...


之前发布的版本可以完美开箱即用,或者针对简单案例进行一些调整,但在运行批量重命名之前,您可能需要考虑以下情况:

  1. 如果在路径层次结构中的同一级别有两个或更多名称(仅abcDEFabcDEFaBcDeF有区别,那么应该发生什么? 重命名脚本应该中止还是只是警告并继续?

  2. 如何为非US-ASCII名称定义小写字母? 如果这样的名字可能存在,是否应该首先执行一次检查和排除通行证?

  3. 如果您在CVS或SVN工作副本上运行重命名操作,则如果更改文件或目录名称上的大小写,则可能会损坏工作副本。 脚本是否也应该找到并调整内部管理文件,例如.svn / entries或CVS / Entries?


你们喜欢的人会让事情变得复杂

重命名'y / AZ / az /'*


借助MacOS,

安装rename包,

brew install rename

使用,

find . -iname "*.py" -type f | xargs -I% rename -c -f  "%"                       

该命令查找所有带*.py扩展名的文件,并将文件名转换为小写。

`f` - forces a rename

示例输出,

$ find . -iname "*.py" -type f
./sample/Sample_File.py
./sample_file.py
$ find . -iname "*.py" -type f | xargs -I% rename -c -f  "%"
$ find . -iname "*.py" -type f
./sample/sample_file.py
./sample_file.py

在OSX中,mv -f显示“相同的文件”错误,所以我重命名了两次。

for i in `find . -name "*" -type f |grep -e "[A-Z]"`; do j=`echo $i | tr '[A-Z]' '[a-z]' | sed s/\-1$//`; mv $i $i-1; mv $i-1 $j; done

如果您不需要关心效率,只需简单地尝试一下。

zip -r foo.zip foo/*
unzip -LL foo.zip

如果您已经拥有或设置了重命名命令(例如,通过在Mac中进行brew安装),这将起作用:

rename --lower-case --force somedir/*

我需要在Windows 7上的cygwin安装程序上执行此操作,并发现我尝试了上面提供的建议(尽管我可能错过了一个工作选项)的语法错误,但直接来自ubutu论坛的此解决方案可以解决问题:-)

ls | while read upName; do loName=`echo "${upName}" | tr '[:upper:]' '[:lower:]'`; mv "$upName" "$loName"; done

(NB我以前用下划线替换空格

for f in *\ *; do mv "$f" "${f// /_}"; done

更小我仍然很喜欢

rename 'y/A-Z/a-z/' *

在不区分大小写的文件系统(如OS X的HFS +)中,您将需要添加-f标志

rename -f 'y/A-Z/a-z/' *

没有人建议排版?

typeset -l new        # always lowercase
find $topPoint |      # not using xargs to make this more readable
  while read old
  do mv "$old" "$new" # quotes for those annoying embedded spaces
  done

在Windows模拟像git bash这可能会失败,因为Windows在引擎盖下不区分大小写。 对于那些,请先将mv的文件添加到另一个名称中,如“$ old.tmp”,然后添加到$ new。


这是一个小型的shell脚本,可以满足您的要求:

root_directory="${1?-please specify parent directory}"
do_it () {
    awk '{ lc= tolower($0); if (lc != $0) print "mv \""  $0 "\" \"" lc "\"" }' | sh
}
# first the folders
find "$root_directory" -depth -type d | do_it
find "$root_directory" ! -type d | do_it

请注意第一次查找中的-depth操作。



使用"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 -depth`; do mv ${f} ${f,,} ; done

find -depth打印每个文件和目录,并在目录本身之前打印目录的内容。 ${f,,}文件名称。


for f in `find`; do mv -v "$f" "`echo $f | tr '[A-Z]' '[a-z]'`"; done




directory-traversal