我正在编写一个简单的 shell 脚本来将文件更改one.PDF
为one.pdf
.我将此文件存储在名为 Task1 的文件夹中。
我的脚本与 Task1 位于同一目录中。当Shell1.sh
我运行它时,Task1 变成 Task1.pdf ,但 one.PDF 中的文件不会改变。我需要相反的方式,但我尝试的任何方法似乎都不起作用,我一直在语法错误、mv 由于资源繁忙而无法移动或只是重命名目录之间交替。
谁能告诉我我做错了什么?
#!/bin/bash
#shebang for bourne shell execution
echo "Hello this is task 1"
#Initial prompt used for testing to see if script ran
#/rename .* .pdf *.pdf // doesnt work
#loop to iterate through each file in current directory and rename
for file in Task1;
do
mv "$file" "${file%.PDF}.pdf"
done
答案1
使用 globbing 来获取文件名:
for file in Task1/*; do mv ...; done
为了精确起见,仅匹配以 结尾的文件.PDF
:
for file in Task1/*.PDF; do mv ...; done
更准确地说,确保我们处理的是文件,而不是目录:
for file in Task1/*.PDF; do [ -f "$file" ] && mv ...; done
作为旁注,您的参数扩展模式很好。
答案2
除了基本的 shell 命令之外,在大多数 Lunux 发行版上,还有一个很好的工具rename
可以完成在单个命令中重命名多个文件的工作:
rename 's/PDF/pdf/' Task1/*
这是一篇关于它的好文章:Rename – 用于在 Linux 中重命名多个文件的命令行工具。
答案3
如果您的发行版rename
是来自 util-linux 的 C 命令(例如 Arch Linux):
rename PDF pdf Task1/*PDF
除非您的 PDF 文件在末尾以外的位置包含字符串“PDF”,例如example_PDF_file.PDF
.