仅更改文件的扩展名

仅更改文件的扩展名

我正在编写一个简单的 shell 脚本来将文件更改one.PDFone.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.

相关内容