使用 bash 添加一个值来重命名文件
rename file by adding a value using bash
我在一个目录及其子目录中有一系列具有相似扩展名的文件。我想在基本名称的整数部分添加一个常量值。有什么办法可以使用 Bash 来实现吗?让我们举个例子。
之前:
../ParentDirectory/Directory/123-File.ext
整数部分加上20后(123+20=143):
../ParentDirectory/Directory/143-File.ext
我假设需要一系列 FIND 和 RENAME 命令,但我不确定如何操作!
假设:
- 顶级目录是“ParentDirectory”及其子目录
包含要重命名的文件。
- 文件的扩展名为“.ext”。
- 文件名以数字开头,不包含其他数字
在文件名中间。
那么请你试试bash
脚本:
#!/bin/bash
find ParentDirectory -type f -name "*.ext" | while IFS= read -r path; do
dir=${path%/*} # extract the directory name
fname=${path##*/} # extract the file name
num=${fname//[^0-9]/} # number part of the file name
remain=${fname//[0-9]/} # remaining part of the file name
(( num += 20 )) # add 20 to the number
newpath="$dir/$num$remain" # compose the new filename
if [[ -f $newpath ]]; then # make sure the new filename doesn't duplicate
echo "$newpath already exists. skip renaming."
else
echo mv -- "$path" "$newpath"
# print the mv command
fi
done
它将mv
命令输出为干运行。如果输出看起来不错,
在 mv
命令之前删除 echo
并再次 运行。
如 Barmar 所建议,如果 perl rename
命令可用,请尝试
相反:
shopt -s globstar
rename -n 's/\d+(?!.*\/)/$& + 20/e' ParentDirectory/**/*.ext
- 正则表达式
\d+(?!.*\/)
匹配数字 而不是 后跟一个斜杠。
它避免匹配目录名称中包含的数字。
rename
命令末尾的e
修饰符告诉perl
将替换 $& + 20
评估为 perl 表达式
而不是文字替换字符串。
ParentDirectory/**/*.ext
由于
shopt -s globstar
选项。
-n
选项仅打印文件名,不执行任何操作。如果输出看起来不错,则删除 -n
.
请注意有两个不同的 rename
命令:“perl rename”
和“non-perl 重命名”取决于发行版。你可以确定
通过查看 man rename
安装了哪个。如果它
包括单词Perl
,它是perl rename
命令。
我在一个目录及其子目录中有一系列具有相似扩展名的文件。我想在基本名称的整数部分添加一个常量值。有什么办法可以使用 Bash 来实现吗?让我们举个例子。
之前: ../ParentDirectory/Directory/123-File.ext
整数部分加上20后(123+20=143): ../ParentDirectory/Directory/143-File.ext
我假设需要一系列 FIND 和 RENAME 命令,但我不确定如何操作!
假设:
- 顶级目录是“ParentDirectory”及其子目录 包含要重命名的文件。
- 文件的扩展名为“.ext”。
- 文件名以数字开头,不包含其他数字 在文件名中间。
那么请你试试bash
脚本:
#!/bin/bash
find ParentDirectory -type f -name "*.ext" | while IFS= read -r path; do
dir=${path%/*} # extract the directory name
fname=${path##*/} # extract the file name
num=${fname//[^0-9]/} # number part of the file name
remain=${fname//[0-9]/} # remaining part of the file name
(( num += 20 )) # add 20 to the number
newpath="$dir/$num$remain" # compose the new filename
if [[ -f $newpath ]]; then # make sure the new filename doesn't duplicate
echo "$newpath already exists. skip renaming."
else
echo mv -- "$path" "$newpath"
# print the mv command
fi
done
它将mv
命令输出为干运行。如果输出看起来不错,
在 mv
命令之前删除 echo
并再次 运行。
如 Barmar 所建议,如果 perl rename
命令可用,请尝试
相反:
shopt -s globstar
rename -n 's/\d+(?!.*\/)/$& + 20/e' ParentDirectory/**/*.ext
- 正则表达式
\d+(?!.*\/)
匹配数字 而不是 后跟一个斜杠。 它避免匹配目录名称中包含的数字。 rename
命令末尾的e
修饰符告诉perl
将替换$& + 20
评估为 perl 表达式 而不是文字替换字符串。ParentDirectory/**/*.ext
由于shopt -s globstar
选项。-n
选项仅打印文件名,不执行任何操作。如果输出看起来不错,则删除-n
.
请注意有两个不同的 rename
命令:“perl rename”
和“non-perl 重命名”取决于发行版。你可以确定
通过查看 man rename
安装了哪个。如果它
包括单词Perl
,它是perl rename
命令。