linux - 如何在 Linux 上使用 tr 或 mv 仅将文件名中的第一个字母大写?

标签 linux bash ubuntu

使用终端,我需要使用 mv/tr/find 编写命令到:

  1. 查找名称以 aoe 开头的文件:[a,o,e]*
  2. 使用 trmv 将这些文件名的首字母从小写改为大写。

一切都必须在一个命令中,而不是脚本中。我尝试过这样的事情:

find -name "[a,o,e]*" -exec {} mv [a,o,e]* [A,O,E]* \;

但它不起作用。

最佳答案

这是一个示例,其中包含我的一些以字母 pg 开头的文件:

$ find . -name '[pg]*.py'
./pycurl-example.py
./pymusic.py
./gtkmenu.py

您可以使用如下所示的内容,但不幸的是,它不会在第一次出现时停止 - 它会翻译找到的所有字母:

$ find . -name '[pg]*.py' |tr '[pg]' '[PG]'
./Pycurl-examPle.Py
./Pymusic.py
./Gtkmenu.Py

Sinc tr 没有像 sed 那样在第一次出现时停止的选项,你可以使用这样的技巧:

$ find . -name '[pg]*.py' -exec bash -c 'echo -n "${0:2:1}"|tr 'pg' 'PG' && echo "${0:3}"' {} \;
Pycurl-example.py
Pymusic.py
Gtkmenu.py

或者甚至更简单,没有tr但使用纯bash(来自@Nominal Animal评论的想法)

$ find . -name '[pg]*.py' -exec bash -c 'fn="${0:2}";echo "${fn^}"' {} \;
Pycurl-example.py
Pymusic.py
Gtkmenu.py

或者,如果您的目的是进行真正的重命名:

$ find . -name '[p]*c.py' -exec bash -c 'fn="${0:2}";mv -v "${fn}" "${fn^}"' {} \;
renamed 'pymusic.py' -> 'Pymusic.py'

以及适用于任何路径的更复杂的重命名:

$ find . -name 'g*.sh' -exec bash -c 'pn="${0%/*}";fn="${0##*/}";mv -v $0 ${pn}/${fn^}' {} \;
renamed './kalitools/Bluelog/scripts/gen_oui.sh' -> './kalitools/Bluelog/scripts/Gen_oui.sh'
renamed './greptest.sh' -> './Greptest.sh'

关于linux - 如何在 Linux 上使用 tr 或 mv 仅将文件名中的第一个字母大写?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49458805/

相关文章:

bash - 将两个文件的头部通过管道传输到一个文件

linux - 使用 xargs 处理文件以实现并发

python - 如何 GREP 单词,而不是包含特定字符的行,并打印整个单词

c - 段错误无效内存 0x0

c - 如何测试我的 gstreamer 插件?是否有用于 gstreamer 插件测试的标准测试套件?

c - Linux进程中return语句的真实故事

php - 在完全上传之前从 zip 文件头获取文件数

linux - 是否有一个程序可以像 printf 一样以整个文件作为输入?

linux - Unix shell 脚本 : pass shell options (-x etc. ) 到嵌套脚本

linux - Golang - 不使用 cgo 时不允许使用 C 源文件