2013-07-09 47 views
0

我正在编写一个脚本来检查目录中的文件具有shell pid作为扩展名,并以删除扩展名的方式重命名它们。我已经将两个文件重命名为使用mv filename filename。$$添加ext。重命名文件并删除shell PID作为扩展

我需要关于如何重新命名它们以便它们不包含PID的建议。

到目前为止,我有威腾:

for file in * 
do 
if [ -s $file ] 
then 
    if [ $file = *.[0-9] ] 
    then 
    #mv command 
    fi 
fi 
done 

**这骚扰我过去几个小时**

:(

+0

修复您的格式以使代码更易于阅读 – Martin

回答

1

溶液可以是:

#!/bin/bash 

touch a.12345 
touch b.23456 

for file in *; do 
    [[ $file =~ \.[0-9]+$ ]] && echo ${file%$BASH_REMATCH} 
done 

输出:

a 
b 

这将切断,只有当它仅包含一个或多个数字的分机。其实它也切断了.0000000000,这不是一个有效的PID,但也许这不是一个大问题。

echo命令可以替换为mv "$file" "${file%$BASH_REMATCH}"

+0

Thanks @TrueY。理解了正则表达式位,可以请你解释我“echo $ {file%$ BASH_REMATCH}”,主要是在文件后面... –

+0

@BashNoob:'[[$ VAR =〜RE]]'右边。匹配的部分放置在'BASH_REMATCH'数组中。因为我只需要它的第一个(也是唯一的)项目,所以不需要添加索引。 '$ {var%pattern}'从变量内容的末尾删除模式。 – TrueY

1

您可以使用删除所有文件的扩展名:

for f in *.* 
do 
    mv "$f" "${f%.*}" 
done 

至于你的企图,[ .. ]不能匹配glob s(并且您的glob只会在.之后匹配一个数字)。为此,使用[[ .. ]]。你也应该引用所有出现的$file。像shellcheck这样的工具会自动指出这些事情。

+0

感谢您的帮助:) –

3

这里的另一个问题:

#!/bin/bash 

shopt -s extglob nullglob 

for i in *.+([[:digit:]]); do 
    mv -- "$f" "${f%.*}" 
done 

的技巧是使用extglob(可能已经默认打开的,通过它不会伤害再次打开它),这样*.+([[:digit:]])扩展到结尾的所有文件名点后跟一个或多个数字。因此我们不需要任何regexps!

+0

+1!我很少使用扩展glob,我想我应该得到更多的expreience!谢谢! – TrueY