viv*_*dos 165 linux rename lowercase
我必须递归地重命名一个完整的文件夹树,这样就不会出现任何大写字母(它是C++源代码,但这无关紧要).忽略CVS和SVN控制文件/文件夹的加分点.首选方法是shell脚本,因为shell应该可以在任何Linux机器上使用.
关于文件重命名的细节有一些有效的论据.
我认为应该覆盖具有相同小写名称的文件,这是用户的问题.当检出案例忽略文件时,系统也会用后者覆盖第一个文件系统.
我会考虑AZ字符并将它们转换为az,其他一切只是要求问题(至少使用源代码).
在Linux系统上运行构建需要脚本,因此我认为应该省略对CVS或SVN控制文件的更改.毕竟,这只是一个划痕结账.也许"出口"更合适.
tri*_*ley 247
更小仍然我很喜欢
rename 'y/A-Z/a-z/' *
Run Code Online (Sandbox Code Playgroud)
在不区分大小写的文件系统(如OS X的HFS +)上,您需要添加-f标志
rename -f 'y/A-Z/a-z/' *
Run Code Online (Sandbox Code Playgroud)
Ale*_*x B 166
使用"rename"命令的简洁版本.
find my_root_dir -depth -exec rename 's/(.*)\/([^\/]*)/$1\/\L$2/' {} \;
Run Code Online (Sandbox Code Playgroud)
这避免了在文件之前重命名目录并尝试将文件移动到不存在的目录(例如,"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
Run Code Online (Sandbox Code Playgroud)
PS
后者允许移动命令更灵活(例如"svn mv").
Swa*_*C H 84
for f in `find`; do mv -v "$f" "`echo $f | tr '[A-Z]' '[a-z]'`"; done
Run Code Online (Sandbox Code Playgroud)
Gin*_*ing 75
如果您不需要关心效率,只需尝试按照即可.
zip -r foo.zip foo/*
unzip -LL foo.zip
Run Code Online (Sandbox Code Playgroud)
niX*_*Xar 14
上面的大多数答案都很危险,因为它们不处理包含奇数字符的名称.对于这类事情,你最安全的选择是使用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"'
Run Code Online (Sandbox Code Playgroud)
我测试了它,它适用于包含空格,各种引号等的文件名.这很重要,因为如果你以root身份运行树上包含由以下内容创建的文件的其他脚本之一:
touch \;\ echo\ hacker::0:0:hacker:\$\'\057\'root:\$\'\057\'bin\$\'\057\'bash
Run Code Online (Sandbox Code Playgroud)
......好吧猜猜......
ale*_*mol 12
如果您已经拥有或设置了重命名命令(例如通过Mac中的brew安装),则此方法有效:
rename --lower-case --force somedir/*
Run Code Online (Sandbox Code Playgroud)
Kim*_*m T 11
我在 Mac OS X 上找到的最简单的方法是使用http://plasmasturm.org/code/rename/ 中的重命名包:
brew install rename
rename --force --lower-case --nows *
Run Code Online (Sandbox Code Playgroud)
--force 重命名即使具有目标名称的文件已经存在。
--lower-case 将文件名转换为全部小写。
--nows 用单个下划线字符替换文件名中的所有空格序列。
Per*_*ere 10
这适用于没有renamePerl脚本的CentOS/Redhat或其他发行版:
for i in $( ls | grep [A-Z] ); do mv -i "$i" "`echo $i | tr 'A-Z' 'a-z'`"; done
Run Code Online (Sandbox Code Playgroud)
来源:https://linuxconfig.org/rename-all-files-from-uppercase-to-lowercase-characters
(在某些发行版中,默认rename命令来自util-linux,这是一个不同的,不兼容的工具)
单线:
for F in K*; do NEWNAME=$(echo "$F" | tr '[:upper:]' '[:lower:]'); mv "$F" "$NEWNAME"; done
Run Code Online (Sandbox Code Playgroud)
甚至:
for F in K*; do mv "$F" "${F,,}"; done
Run Code Online (Sandbox Code Playgroud)
请注意,这只会转换以字母 K 开头的文件/目录,因此请进行相应调整。
这是我使用 Bash shell 脚本的次优解决方案:
#!/bin/bash
# First, rename all folders
for f in `find . -depth ! -name CVS -type d`; do
g=`dirname "$f"`/`basename "$f" | tr '[A-Z]' '[a-z]'`
if [ "xxx$f" != "xxx$g" ]; then
echo "Renaming folder $f"
mv -f "$f" "$g"
fi
done
# Now, rename all files
for f in `find . ! -type d`; do
g=`dirname "$f"`/`basename "$f" | tr '[A-Z]' '[a-z]'`
if [ "xxx$f" != "xxx$g" ]; then
echo "Renaming file $f"
mv -f "$f" "$g"
fi
done
Run Code Online (Sandbox Code Playgroud)
文件夹都被正确重命名,并且mv在权限不匹配时不会提问,并且 CVS 文件夹没有被重命名(不幸的是,该文件夹中的 CVS 控制文件仍然被重命名)。
由于“find -depth”和“find | sort -r”都以可用的顺序返回文件夹列表以进行重命名,因此我更喜欢使用“-depth”来搜索文件夹。
使用 Larry Wall 的文件名修复器:
$op = shift or die $help;
chomp(@ARGV = <STDIN>) unless @ARGV;
for (@ARGV) {
$was = $_;
eval $op;
die $@ if $@;
rename($was,$_) unless $was eq $_;
}
Run Code Online (Sandbox Code Playgroud)
这很简单
find | fix 'tr/A-Z/a-z/'
Run Code Online (Sandbox Code Playgroud)
(fix当然上面的脚本在哪里)
最初的问题要求忽略 SVN 和 CVS 目录,这可以通过在 find 命令中添加 -prune 来完成。例如忽略 CVS:
find . -name CVS -prune -o -exec mv '{}' `echo {} | tr '[A-Z]' '[a-z]'` \; -print
Run Code Online (Sandbox Code Playgroud)
[编辑]我尝试了这个,并且由于我实际上不明白的原因,在查找中嵌入小写翻译不起作用。因此,将其修改为:
$> cat > tolower
#!/bin/bash
mv $1 `echo $1 | tr '[:upper:]' '[:lower:]'`
^D
$> chmod u+x tolower
$> find . -name CVS -prune -o -exec tolower '{}' \;
Run Code Online (Sandbox Code Playgroud)
伊恩
不可移植,仅限 Zsh,但非常简洁。
首先,确保zmv已加载。
autoload -U zmv
Run Code Online (Sandbox Code Playgroud)
另外,请确保extendedglob已打开:
setopt extendedglob
Run Code Online (Sandbox Code Playgroud)
然后使用:
zmv '(**/)(*)~CVS~**/CVS' '${1}${(L)2}'
Run Code Online (Sandbox Code Playgroud)
递归地小写名称不是CVS 的文件和目录。
这在 macOS 上也能很好地工作:
ruby -e "Dir['*'].each { |p| File.rename(p, p.downcase) }"
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
191159 次 |
| 最近记录: |