在文件名中加上括号-批量转换

时间:2018-10-18 07:25:22

标签: bash filenames parentheses

我有一堆包含括号的文件,例如

long_file_name (12).txt 

(注意数字前的空格) 我想从文件名中提取所有数字。我怎样才能做到这一点? 我找到了该线程stackoverflow link,但没有帮助-问题是我想将文件名分配给变量,而不是分别更改每个文件。

感谢所有帮助

3 个答案:

答案 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

这将在文件名中给出数字