我有多个文件在多个目录,我必须重命名这些文件从小写到大写;文件扩展名可能会有所不同,并且需要使用小写(对于扩展名为大写的文件,也应该重命名)。
注:我有rename
版本从util-linux
的CentOS Linux 7。
我试过这个:
find /mydir -depth | xargs -n 1 rename -v 's/(.*)\/([^\/]*)/$1\/\U$2/' {} \;
find /mydir -depth | xargs -n 1 rename -v 's/(.*)\/([^\/]*)/$2\/\L$2/' {} \;
但它不工作,它什么也没改变,我没有输出。
我尝试了另一种解决方案:
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
这一个部分工作,但转换文件扩展名为大写太多。
关于如何保持/转换扩展名为小写有什么建议吗?
谢谢你,谢谢你
3条答案
按热度按时间r7xajy2e1#
Perl
rename
的可能解决方案:问题中的命令有几个问题。
您似乎混淆了
find
的-exec
操作和xargs
的语法。第一个
xargs
版本在文件名包含空格时会出现问题。如果将
\;
替换为+
,则会将多个文件名传递给rename
的一个调用。只有Perl版本的
rename
命令才支持替换命令。您可能必须安装此版本。请参阅Get the Perl rename utility instead of the built-in rename替换在我的测试中不起作用。我成功地使用
第一个组
(.*\/)?
可以选择匹配一个带有尾随/
的字符序列。这用于复制未更改的目录。第二组
([^.]*)
匹配除.
之外的字符序列。这是文件名中 first 点(如果有)之前的部分,将转换为大写。如果文件名有多个扩展名,则所有扩展名都将保持不变,例如:
Path/To/Foo.Bar.Baz
-〉Path/To/FOO.Bar.Baz
wwodge7n2#
rename
-独立解(将find
与mv
一起使用)您可以使用以下命令重命名目录中的所有文件:
第一部分(
for i in $( ls | grep [A-Z] );
)查找所有大写字符并执行,直到所有文件都被“扫描”。第二部分(``)将所有大写字符转换为小写字符。
基于Perl的
rename
相关解决方案此命令将大写字符更改为小写字符。
-f
选项允许覆盖现有文件,但这不是必要的。6mzjoqzu3#
建议使用
awk
技巧来生成所有必需的mv
命令:检查结果,并同时运行所有
mv
命令:awk
脚本script.awk
说明测试: