重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
tr 命令定义:从标准输入删除或替换字符,并将结果写入标准输出。
专业领域包括网站建设、成都网站建设、购物商城网站建设、微信营销、系统平台开发, 与其他网站设计及系统开发公司不同,创新互联建站的整合解决方案结合了帮做网络品牌建设经验和互联网整合营销的理念,并将策略和执行紧密结合,为客户提供全网互联网整合方案。
根据定义:(1)tr命令并不能对文件内容进行直接处理,所以仅tr命令不能修改文件内容;(2)文件内容要用tr处理,就需要作为tr的标准输入。你的命令里用的echo |或者 或者 cat |都是这个作用,就是把文件内容输出到标准输出并作为tr的标准输入,所以tr处理的仅仅是标准输出上的内容,并不是文件本身,所以文件内容不会改变;(3)tr处理后的内容是“写入标准输出”的,并没有写入源文件,所以需要其他命令把输出再写到某个文件,如输出重定向符,可以把输出到标准输出上的内容重定向输出到某个文件,如“cat qwer | tr [a-z] [A-Z] qwer2.txt”
用cat file | tr a-z A-Z newfile 可以将文件内容转换为大写。cat file | tr A-Z a-z newfile可以转换为小写。
也可以用 awk '{print toupper($1)}' file newfile
windows有个设置,默认是选上的,就是要是一个文件名全部是大写字母,就自动变成全是小写
这是因为在以前的dos系统里文件名只能是大写,自己输入小写也自动当成大写处理,但是在windows里支持小写文件名,这样不太符合windows的习惯
就是说,在windows里看着是大写,实际上本来就是小写,解决方法是可以在linux里改成大写,或者在windows里去掉那个设置,具体记不清了,大概是在文件夹选项里!
linux中批量把文件名大小写转换一哥们从现场打来急电说现在有一个目录,目录下有上千个文件,现在需要把文件名由小写全部转化为大写。首先不能写脚本,那样的话还要教他用vi,
改权限,只能用命令了。字符转换嘛,当然想到的是
tr
:
for
file
in
*
;do
mv
$file
`echo
$file
|
tr
'a-z'
'A-Z'`;done过了一会儿这哥们又打电话说,扩展名不要改为大写的,保留为小写就行了。这样明显分段的事情当然要交给
awk
了:
for
file
in
*;do
mv
$file
`echo
$file
|
awk
-F
.
toupper($1).$2}'
`;done这样是可以把类似
a.txt
的文件修改了,但有多个扩展名的就没招了,比如
b.tar.gz,还好
awk
支持变量:
for
file
in
*;do
mv
$file
`echo
$file
|awk
-F
.
'
{
for
(i
=
1;
i
=
NF;i++)
if
(i
==
1)
result
=
toupper($i);
else
result
+=
.$i;
$result;
}'
`;done但结果是错的,一个文件名也没有改变,查了下说gawk才支持toupper,
tolower,换成gawk
还是不对。最后没办法只好找个折衷的方法,先全部转化为大写,然后再将扩展名转回小写:for
file
in
*;
do
mv
$file
`echo
$file
|
sed
-e
s//.TXT//.txt/g
`;done但是/.并没有被转义成.,
而依然是代表任意字符,这样的话如果basename中含有扩展名就悲剧了。
试了几下发现这样才是转义的:
sed
-e
s/[.]TXT/.txt/g
`;ok.
正确。
在大写状态下,按一次变为小写,再按一次变为大写,再按一次变为小写。
Linux系统下文件名是区分大小写的,文件名采用大小写是不一样的;linux变量、命令、命令参数都是区分大小写的。
可以追溯到linux系统的开发,linux的内核是使用C语言开发的,C语言区分大小写。所以linux也区分大小写了。