文件名中的括号——批量转换

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

中的数字