13

我正在尝试编写一个shell命令,我可以在其中指定一个目录,然后里面的每个文件和目录都将每个单词的第一个字母大写。所以

/doCumenTS/tesT.txt

应该改为

/DoCumenTS/TesT.txt

我想它应该像这样开始

for i in directory do
tr something_goes_here
done

我不知道的问题是如何只做第一个字母。我制作了一个将整个文件名大写的脚本,但我不知道如何只获取每个单词的第一个字母。

谢谢!

4

6 回答 6

7

使用 GNU Sed

使用 GNU sed 可以很容易地做到这一点。例如:

$ echo '/doCumenTS/tesT.txt' | sed 's!/.!\U&!g'
/DoCumenTS/TesT.txt

限制

请注意,\U 转义是 GNU sed 扩展。手册说:

最后,作为 GNU 'sed' 扩展,您可以包含一个由反斜杠和字母“L”、“l”、“U”、“u”或“E”之一组成的特殊序列。

`\U'
     Turn the replacement to uppercase until a `\L' or `\E' is found
于 2012-07-06T23:36:10.007 回答
7

Bash 4.0+ 有一个参数替换“小写到大写”。要仅更改第一个字符,请像这样使用它:

list=( 'aaa/bbb' 'aAAA' 'aaa/bbb/ccc' 'aaa bbb/ccc' )

IFS='/'
for item in "${list[@]}"; do
  split=( $item )
  echo "'${split[*]^}'"
done

结果:

'Aaa/Bbb'
'AAAA'
'Aaa/Bbb/Ccc'
'Aaa bbb/Ccc'
于 2012-07-07T07:57:31.420 回答
6
Source="ONE TWO THREE FOUR"
Target="One Two Three Four"

解决方案如下:

Target=`echo $Source | tr [A-Z] [a-z] | sed -e 's/^./\U&/g; s/ ./\U&/g'`
echo $Target

One Two Three Four

取自这里:http ://souravgulati.webs.com/apps/forums/topics/show/8584862-shell-script-capitalize-first-letter-of-every-word-of-a-line-

于 2013-03-29T12:17:53.507 回答
3

前:

$ find . -mindepth 1 -depth -print
./file1
./bar/file3
./bar
./foo/file2
./foo/baz/file4
./foo/baz
./foo

修改:

find . -mindepth 1 -depth -print0 | 
while IFS= read -r -d '' filename; do 
    b=$(basename "$filename")
    mv "$filename" "$(dirname "$filename")/${b^}"
done

后:

$ find . -mindepth 1 -depth -print
./Foo/Baz/File4
./Foo/Baz
./Foo/File2
./Foo
./Bar/File3
./Bar
./File1
于 2014-06-06T17:45:25.007 回答
2

v4中的功能避免循环:

input='/doCumenTS/tesT.txt'
IFS='/'
dirs=( $input )           # split on '/'
output=( "${dirs[*]^}" )  # capitalize
IFS=$' \t\n'              # reset IFS

您可以将其嵌入到 shell 函数中:

capitalize_subdirs()
{
  local IFS='/'
  dirs=( $1 )
  echo "${dirs[*]^}"
}

用法:

output=$( capitalize_subdirs '/doCumenTS/tesT.txt' )

这甚至适用于包含空格、制表符和新行的路径名!

$ capitalize_subdirs '/doCumenTS/tesT.txt'
/DoCumenTS/TesT.txt

$ capitalize_subdirs $'/d\noCu\tme nTS/tesT.txt'
/D
oCu     me nTS/TesT.txt
于 2014-06-06T08:07:13.473 回答
0

使用重命名,您可以在当前目录中执行此操作:

rename 's/./\U$&/' *; rename 's/ ./\U$&/g' *;

使用该-n选项首先显示更改而不执行更改。

于 2021-09-01T07:50:06.733 回答