批量重命名文件以在 linux 中包含文件夹/目录名称

Posted

技术标签:

【中文标题】批量重命名文件以在 linux 中包含文件夹/目录名称【英文标题】:Batch rename files to include folder/directory name in linux 【发布时间】:2013-10-30 19:17:19 【问题描述】:

我需要一些帮助来完成将文件夹文件按顺序重命名为文件夹名称的脚本。我原以为这将是一个常见的动作,但我似乎无法在搜索后找到我正在寻找的东西。我发现了一些可以按顺序重命名文件的方法,但我想将文件夹或目录名称附加到文件的前面。

#!/bin/bash
a=1
for i in *.jpg; do
  new=$(printf "%04d.jpg" $a) #04 pad to length of 4
  mv $i $new
  let a=a+1
done

所以我想要这些文件夹和文件:

~/tmp/6856u56u56.jpg
~/tmp/7567787.jpg

~/tmp2/46u65h5hh.jpg
~/tmp2/b656hy6hjh.jpg

看起来像:

~/tmp/UG-tmp-001.jpg
~/tmp/UG-tmp-002.jpg

~/tmp2/UG-tmp2-001.jpg
~/tmp2/UG-tmp2-002.jpg

~/tmp/(text)-(directory name)-(sequential numbering).(extension)

运行脚本后。

谁能帮帮我?此外,该文件不一定是 .jpg,并且该文件夹的名称中可能包含空格。如果这是一个问题,请告诉我。这适用于使用 bash 脚本的 linux。如果它运行良好,我可能会尝试将其集成到文件管理器的右键单击中。提前致谢!

【问题讨论】:

【参考方案1】:

看看预期的结果,这段代码应该可以工作

#!/bin/bash
a=1
result=$(printf '%s\n' "$PWD##*/")
echo $result
filename="text-$result-"  #replace text with what you need
for i in *.jpg; do
  newfilename="$filename$a.jpg" # since the extension is does not change you can hardcode it
  echo $newfilename
  mv $i $newfilename
  let a=a+1
done

【讨论】:

我错过了扩展名可以更改您问题的一部分,您可以轻松地在变量中获取文件的扩展名并将其附加到 ***.com/questions/965053/… 谢谢!我遇到了一个错误,尽管当我尝试自己弄清楚它时这让我很困惑,它必须是特定于发行版的东西。我在使用 opensuse 时收到“mv: target ‘blah-12.jpg’ is not a directory”错误消息。你知道如何解决这个问题吗?感谢您的帮助! 更新:我在搜索后想通了,我在脚本之前添加了“IFS=''”,它修复了文件名中的空格问题。不过,我真的很想让它在编号时显示零,比如 0001 而不是 1。我会尝试自己弄清楚,但如果你知道如何解决这个问题并且不介意,我将不胜感激!谢谢! 你可以使用这个printf -v j "%05d" $a并将变量newfilename赋值为newfilename=$filename$j。 printf 语句通过在前面添加零来格式化 a 的值,使位数始终为 5。该值存储在变量 j 中。 一个小脚本作为演示#!/bin/bash a=1 while [ $a -lt 300 ] do let a=a+1 printf -v j "%05d" $a echo $j; done;

以上是关于批量重命名文件以在 linux 中包含文件夹/目录名称的主要内容,如果未能解决你的问题,请参考以下文章

文件批量重命名 如1-2 3-4 5-6

linux wget指定下载目录和重命名

Powershell 批量重命名文件中含有 [] 导致报错

如何批量重命名目录、子目录和文件?

DOS按规则批量重命名所有(子)目录下文件

DOS按规则批量重命名所有(子)目录下文件