在 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 文档以获取更多信息。