# Using globstar
shopt -s globstar
files=(/the/path/**/*.abc)
# Best to process the files in chunks to avoid exceeding the maximum argument
# length. 100 at a time is probably good enough.
# See http://mywiki.wooledge.org/BashFAQ/095
for ((i = 0; i < ${#files[@]}; i += 100)); do
rename 's/\.abc$/.edefg/' "${files[@]:i:100}"
done
# Using find:
find /the/path -depth -name "*.abc" -exec rename 's/\.abc$/.edefg/' {} +
一种可移植的方式(适用于任何符合 POSIX 的系统):
在 bash4 中,您可以使用 globstar 来获取递归 glob (**):
Ubuntu 中的 (perl)
rename
命令可以使用 perl 正则表达式语法重命名文件,您可以将其与 globstar 或find
:另请参阅http://mywiki.wooledge.org/BashFAQ/030
如果所有文件都在同一个文件夹中,这将完成所需的任务
要递归地重命名文件,请使用以下命令:
递归重命名的一个问题是,无论您使用哪种方法来定位文件,它都会将整个路径传递给
rename
,而不仅仅是文件名。这使得在嵌套文件夹中进行复杂的重命名变得困难。我用
find
's-execdir
action来解决这个问题。如果您使用-execdir
而不是-exec
,则从包含匹配文件的子目录运行指定的命令。因此,它不会将整个路径传递给rename
,而是仅传递./filename
。这使得编写正则表达式变得更加容易。详细地:
-type f
意味着只查找文件,而不是目录-name '*.abc'
表示仅匹配以 .abc 结尾的文件名'{}'
是标记-execdir
将插入找到的路径的位置的占位符。需要单引号,以允许它处理带有空格和 shell 字符的文件名。-type
和之后的反斜杠-name
是 bash 行继续字符。我使用它们来使这个示例更具可读性,但是如果您将命令全部放在一行上,则不需要它们。-execdir
行尾的反斜杠是必需的。它用于转义分号,该分号终止由-execdir
. 乐趣!正则表达式的解释:
s/
正则表达式的开始\.\/
匹配 -execdir 传入的前导 ./ 。使用 \ 转义 . 和 / 元字符(注意:这部分因您的 . 版本而异find
。请参阅用户 @apollo 的评论)(.+)
匹配文件名。括号捕获匹配以供以后使用\.abc
转义点,匹配 abc$
将匹配锚定在字符串的末尾/
标记正则表达式“匹配”部分的结束,以及“替换”部分的开始version1_
将此文本添加到每个文件名$1
引用现有文件名,因为我们用括号捕获它。如果您在“匹配”部分使用多组括号,您可以在此处使用 $2、$3 等来引用它们。.abc
新文件名将以 .abc 结尾。无需在“替换”部分中转义点元字符/
正则表达式的结尾前
后
提示:
rename
's -n 选项很有用。它会进行试运行并向您显示它将更改的名称,但不会进行任何更改。另一种便携方式:
另请参阅有关为什么不应该解析的条目
ls
。编辑:如果你必须使用 basename 你的语法是:
https://unix.stackexchange.com/questions/19654/changeing-extension-to-multiple-files
我会使用同名包中的 mmv命令:
;
匹配零个或多个并且*/
对应#1
于替换。*
对应#2
于。非递归版本将是这就是我所做的,并且按照我想要的方式工作。我使用了
mv
命令。我有多个.3gp
文件,我想将它们全部重命名为.mp4
这是一个简短的oneliner:
它只是扫描当前目录,选择所有 .3gp 文件,然后重命名(使用 mv)为
ren-name_of_file.mp4
我找到了一种简单的方法来实现这一点。要将许多文件的扩展名从 jpg 更改为 pdf,请使用:
重命名文件和目录
find -execdir | rename
如果您要重命名文件和目录而不是简单地使用后缀,那么这是一个很好的模式:
awesome
-execdir
选项cd
在执行命令之前进入目录rename
,不像-exec
.-depth
确保重命名首先发生在孩子身上,然后是父母身上,以防止缺少父目录的潜在问题。-execdir
是必需的,因为 rename 不能很好地与非基本名称输入路径一起使用,例如以下失败:之所以
PATH
需要进行黑客攻击,是因为-execdir
有一个非常烦人的缺点:如果您的环境变量中有任何相对路径,find
则非常固执己见并且拒绝做任何事情,例如,失败:-execdir
PATH
./node_modules/.bin
另请参阅:为什么使用 '-execdir' 操作对于 PATH 中的目录不安全?
-execdir
是 POSIX 的 GNU find扩展。rename
是基于 Perl 的,来自rename
包。在 Ubuntu 18.10 中测试。重命名前瞻解决方法
如果您的输入路径不是来自
find
,或者如果您已经受够了相对路径的烦恼,我们可以使用一些 Perl 前瞻来安全地重命名目录,如下所示:我还没有找到一个方便的类比
-execdir
:xargs
https: //superuser.com/questions/893890/xargs-change-working-directory-to-file-path-before-executing/915686sort -r
需要确保文件位于其各自目录之后,因为较长的路径位于具有相同前缀的较短路径之后。