最初的解决方案是:
rename 'y/a-z/A-Z/' *
Run Code Online (Sandbox Code Playgroud)
它获取当前目录中的每个文件/目录,并将 az 范围内的每个字符更改为其相应的大写版本。
问题rename是没有选项可以进入目录内部以递归地应用重命名,并且*字符会扩展为当前目录(文件和目录)的名称。更重要的是,此命令还会重命名目录,但您只想重命名文件。
要递归地执行此操作,但仅对文件进行操作,您可以使用find,它会递归搜索,并将每个文件传递给rename:
find . -type f -execdir rename 'y/a-z/A-Z/' {} \;
Run Code Online (Sandbox Code Playgroud)
此命令仅搜索文件,并对找到该文件的rename目录(选项)内的每个文件执行。execdir这很重要,因为否则find会将文件的完整路径(例如:./fold1/fold2/file.txt')传递给rename,而后者又会尝试将完整路径传递为大写: (./FOLD1/FOLD2/FILE.txt) TXT) 这将导致错误,因为文件夹FOLD1和FOLD2不存在。