文件名中的括号——批量转换
Parenthesis in a file name -- batch conversion
我有一堆包含括号的文件,比如
long_file_name (12).txt
(注意数字前的space)
我想从文件名中提取所有数字。我怎样才能做到这一点?
我找到了这个线程 Whosebug link 但它没有帮助 - 问题是我想将文件名分配给一个变量而不是单独更改每个文件。
感谢大家的帮助
您可以在 bash 中使用变量 interpolation/substitution:
$ F="long_file_name (12).txt"
$ echo ${F/*(/}
12).txt
$ G=${F/*(/}; echo ${G/)*/}
12
$ G=${F/*(/}; H=${G/)*/}; echo $H
12
$
简而言之,这只会为您提供文件名中括号中的数字:
F="long_file_name (12).txt"
G=${F/*(/}; H=${G/)*/}; echo $H
如果您有其他格式的文件名,请提供更多示例以供测试。
如果要重命名文件名中包含括号的所有文件,可以使用此 bash 脚本:
cd /path/to/my/files
for i in *; do
[[ -f "$i" ]] && { [[ "$i" == "${i/ (*)/}" ]] || mv -v "$i" "${i/ (*)/}"; }
done
它查找目录中的所有文件并检查文件名是否包含括号。如果是,则重命名完成。
相反,如果您想用文件编号重命名文件,请使用:
for i in *; do
if [[ -f "$i" ]]; then
newname=$(echo "$i" | sed 's/.*(\([^)]\+\))[^.]*\(.*\)$//')
[[ "$newname" == "$i" ]] || mv -v "$i" "$newname"
fi
done
假设您的文件的命名约定保持为:long_file_name ([0-9][0-9]).txt
,那么您可以使用 find
命令捕获变量中的文件名。
cd /path/to/files/
var=$(find . -type f -name "long_file_name ([0-9][0-9]).txt"|sed 's,^./,,g')
echo "${var}" |rev |cut -c6-7 |rev
这将给出 file_names
中的数字
我有一堆包含括号的文件,比如
long_file_name (12).txt
(注意数字前的space) 我想从文件名中提取所有数字。我怎样才能做到这一点? 我找到了这个线程 Whosebug link 但它没有帮助 - 问题是我想将文件名分配给一个变量而不是单独更改每个文件。
感谢大家的帮助
您可以在 bash 中使用变量 interpolation/substitution:
$ F="long_file_name (12).txt"
$ echo ${F/*(/}
12).txt
$ G=${F/*(/}; echo ${G/)*/}
12
$ G=${F/*(/}; H=${G/)*/}; echo $H
12
$
简而言之,这只会为您提供文件名中括号中的数字:
F="long_file_name (12).txt"
G=${F/*(/}; H=${G/)*/}; echo $H
如果您有其他格式的文件名,请提供更多示例以供测试。
如果要重命名文件名中包含括号的所有文件,可以使用此 bash 脚本:
cd /path/to/my/files
for i in *; do
[[ -f "$i" ]] && { [[ "$i" == "${i/ (*)/}" ]] || mv -v "$i" "${i/ (*)/}"; }
done
它查找目录中的所有文件并检查文件名是否包含括号。如果是,则重命名完成。
相反,如果您想用文件编号重命名文件,请使用:
for i in *; do
if [[ -f "$i" ]]; then
newname=$(echo "$i" | sed 's/.*(\([^)]\+\))[^.]*\(.*\)$//')
[[ "$newname" == "$i" ]] || mv -v "$i" "$newname"
fi
done
假设您的文件的命名约定保持为:long_file_name ([0-9][0-9]).txt
,那么您可以使用 find
命令捕获变量中的文件名。
cd /path/to/files/
var=$(find . -type f -name "long_file_name ([0-9][0-9]).txt"|sed 's,^./,,g')
echo "${var}" |rev |cut -c6-7 |rev
这将给出 file_names
中的数字