我有一个简单的字符串,它将按顺序重命名文件夹中的所有 jpeg 文件:
ls -v | cat -n | while read n f; do mv -n "$f" "pic-$n.jpg"; done
但我有一个包含许多不同文件类型的文件夹。是否有一个简单的字符串或变量可以替换.jpg
为以保留文件扩展名?或者现在必须是完整的脚本吗?如果可能的话,我想把它保留在一个衬垫中。
例子
假设我有一个这样的文件夹:
a long hash name.mp4
another name.m4v
video.mov
another name.mp4
等等。我想重命名这些文件,如下所示,以便它们看起来更有组织性并且没有太多字符,如下所示:
vid-1.mp4
vid-2.m4v
vid-3.mov
vid-4.mp4
如果我使用ls -v | cat -n | while read n f; do mv -n "$f" "vid-$n"; done
,那么我就不会有文件扩展名。我想保留文件扩展名,因为有时打开它们更容易。
我主要想知道 bash 中是否有一个全局变量来定义文件扩展名
不要在这里使用循环,只需使用
rename
:如果看起来正确,请重新运行,而无需
-n
实际重命名。解释:
该
rename
命令是一个 perl 脚本,可以运行 perl 代码来重命名文件。在这里,我们使用替换运算符 (s/old/new/
) 和几个特殊选项:/s
使得替换运算符将其输入视为单行,从而允许.
匹配换行符。我们需要它来处理带有换行符的文件名,正如我在上面的示例中所做的那样。/e
我们将右侧 (s/left/right/
) 作为 perl 表达式进行计算。该表达式的"pic-" . ++$a . "$1"
意思是“字符串pic-
,然后变量的值$a
加一,然后是左侧括号内匹配的内容”。在我们的例子中,是扩展。接下来,使用的正则表达式 (
.*(\..+)
) 表示“零个或多个字符 (.*
) 直到最后一个.
(\.
匹配文字.
),然后是一个或多个字符 (.+
)。因为最后一个\..+
位于括号中,所以匹配的内容(扩展名)可用如$1
右侧所示。在不带 的情况下运行上面的命令后
-n
,我留下了:或者,您可以在 shell 中使用以下命令执行此操作:
在这里,我们循环遍历所有文件(和目录,如果您不想重命名目录,请小心),将每个文件保存为
$file
. 然后,我们得到扩展名${file##*.}
. 该格式将从变量 中${variable##pattern}
删除 的最长匹配项。通过使用,我们删除了直到最后的所有内容,只留下我们另存为的扩展名。pattern
$variable
${file##*.}
.
$ext
接下来,该
mv
命令将重命名$file
为,加上我们用 初始化pic-
的变量的值,加一,然后是 a和扩展名。$i
i=1
.
与
rename
上面的解决方案一样,这也可以处理任意文件名:如果您特别需要按版本排序顺序对文件进行算术命名(与 一样
ls -v
),那么我建议类似或者,如果您想对新名称进行零填充(这使得后续排序更容易),也许
echo
一旦您确认将以所需的顺序处理正确的文件,请删除。如果您不关心可读性,您当然可以将它们写为“一行”(如果您愿意),例如。