我有一堆包含括号的文件,例如
long_file_name (12).txt
(注意数字前的空格) 我想从文件名中提取所有数字。我怎样才能做到这一点? 我找到了该线程stackoverflow link,但没有帮助-问题是我想将文件名分配给变量,而不是分别更改每个文件。
感谢所有帮助
答案 0 :(得分:1)
您可以使用变量插值/替换在bash中执行此操作:
$ 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
如果您使用其他格式的文件名,请提供更多示例进行测试。
答案 1 :(得分:0)
如果要重命名其文件名中带有括号的所有文件,则可以使用以下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/.*(\([^)]\+\))[^.]*\(.*\)$/\1\2/')
[[ "$newname" == "$i" ]] || mv -v "$i" "$newname"
fi
done
答案 2 :(得分:0)
假设文件的命名约定保持不变: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
这将在文件名中给出数字