Linux:重命名文件但保留扩展名?

Linux:重命名文件但保留扩展名?

在 Windows/DOS 中,我可以rename myfile.* yourfile.*更改名称但保留扩展名。在 Linux 上如何实现?

手册页只建议如何更改扩展,但这与我想要的正好相反。

奖励:
我实际上想将照片的创建日期放入其文件名中,以获得类似的效果20091231 2359 New Year.jpg。恐怕我需要一些非平凡的命令组合才能实现这一点?

答案1

这是奖励问题的答案。

我实际上想将照片的创建日期放入其文件名中,以获得类似 20091231 2359 New Year.jpg 的文件。恐怕我需要一些非平凡的命令组合才能实现这一点?

假设你想从 EXIF 数据中获取照片的创建日期,你需要一个单独的工具来实现这一点。幸运的是,jhead-n通过其选项,提供了一种简单的方法来精确地完成您想要做的事情。

$ jhead -h
 [...]

 -n[format-string]

             Rename files according to date.  Uses exif date if present, file
             date otherwise.  If the optional format-string is not supplied,
             the format is mmdd-hhmmss.  If a format-string is given, it is
             is passed to the 'strftime' function for formatting
             In addition to strftime format codes:
             '%f' as part of the string will include the original file name
             [...]

以下是一个例子:

$ jhead -n%Y-%m-%d-%f New_year.jpg   
New_year.jpg --> 2009-12-31-New_year.jpg

编辑:当然,如果要对一组照片执行此操作,则需要执行以下操作:

$ for i in *jpg; do jhead -n%Y-%m-%d-%f $i; done

要根据自己的喜好调整日期格式,请查看的输出date --help,例如;它将列出可用的格式代码。

(jhead 广泛应用于不同的系统。例如,如果你使用的是 Ubuntu 或 Debian,只需输入sudo apt-get install jhead即可安装它。)

答案2

对于重命名部分,“rename”程序将起作用。它与您在手册页中看到的示例相同,只是互换了位置。

justin@eee:/tmp/q$ touch myfile.{a,b,c,d}
justin@eee:/tmp/q$ ls
myfile.a  myfile.b  myfile.c  myfile.d
justin@eee:/tmp/q$ rename -v s/myfile/yourfile/ myfile.*
myfile.a renamed as yourfile.a
myfile.b renamed as yourfile.b
myfile.c renamed as yourfile.c
myfile.d renamed as yourfile.d
justin@eee:/tmp/q$ ls
yourfile.a  yourfile.b  yourfile.c  yourfile.d
justin@eee:/tmp/q$ 

答案3

以下是几种操作文件名的不同方法

for f in *.jpg
do
    mv "$f" "before_part${f%.*}after_part.${f##*.}"
    # OR mv "$f" "before_part$(basename "$f" ".jpg")after_part.jpg"
done

参数扩展mv命令中工作如下:

${f%.*}- 从 中包含的字符串末尾删除最短的匹配模式$f,在本例中,删除最后一个点之后的所有内容。单个%表示“从末尾开始最短”。

${f##*.}- 从 中包含的字符串开头删除最长的匹配模式$f,在本例中是最后一个点之前的所有内容(包括最后一个点)(这也包括任何其他点)。双#( ##) 表示“从开头开始最长”。

例如,如果$f包含“Foo.bar.baZ.jpg”:

echo "${f%.*}"

给出

Foo.bar.baZ

echo "${f##*.}"

给出

jpg

因此,mv命令一旦展开将如下所示:

mv "Foo.bar.baZ.jpg" "before_partFoo.bar.baZafter_part.jpg"

答案4

Linux 中没有文件扩展名。

使用正则表达式从文件名中剪切特定子字符串并访问它们。

例子:

真实场景:您正在从 chm 文件中提取 html。Windows 中的文件名不区分大小写,因此在 Linux 中您将获得断开的链接。您有一个名为索引.HTML, 但href="index.html"在 URL 中。因此,您的目标是调整文件名以匹配其链接。

假设变量中有一个文件名:

FILENAME='index.HTML'

从 3.0 版开始,bash 本身支持正则表达式,因此您不需要任何额外的工具(如 grep/sed/perl 等)来执行字符串操作。以下示例说明了字符串中后端匹配的替换:

echo ${FILENAME/%\.HTML/.html}

如果您愿意,可以对匹配和替换字符串进行参数化,这在编写脚本时提供了额外的灵活性。以下代码片段实现了相同的目标:

match='\.HTML'
replacement='.html'
echo ${FILENAME/%$match/$replacement}

请查阅 bash 文档以获取更多信息。

相关内容