Bash在字符串中重命名最后一个下划线

时间:2015-12-28 12:02:03

标签: bash rename

我有一个包含文件的目录,其中一些文件以下划线结尾。

我想测试每个文件以查看它是否以下划线结尾,然后剥离下划线。

我目前正在运行以下代码:

for file in *;do
   echo $file;
   if [[  "${file:$length:1}" == "_"   ]];then 
       mv $file  $(echo $file | sed "s/.$//g");
   fi
done

但它似乎没有用下划线重命名文件。例如,如果我有一个名为all_indoors_的文件,我希望它能给我all_indoors

4 个答案:

答案 0 :(得分:1)

您可以使用内置string substitution

for file in *_; do
    mv "$file" "${file%_}"
done    

答案 1 :(得分:1)

只需使用regex to check the string

for file in *
do
   [[ $file =~ "_$" ]] && echo mv "$file" "${file%%_}"
done

一旦确定它按预期工作,请删除echo以执行mv命令!

使用*_甚至可能更干净,因此for只会循环覆盖名称以_结尾的文件,而hek2mgl会在评论中建议。

for file in *_
do
   echo mv "$file" "${file%%_}"
done

答案 2 :(得分:0)

您可以使用哪个是递归的:

while read f; do 
  mv "$f" "${f:0:-1}"; # Remove last character from $f
done < <(find . -type f -name '*_')

答案 3 :(得分:0)

虽然不是纯粹的bash方法,但您可以使用rename.ul(由perl背后的人Larry Wall编写)。重命名不是默认的linux环境的一部分,而是util-linux的一部分。

您使用重命名:

rename perlexpr files

(省略了一些标志)。

所以你可以使用:

rename 's/_$//' *

如果你想删除包括和在下划线之后的所有字符。

正如@ hek2mgl指出的那样,有多个rename命令(参见here),所以首先测试你是否选择了正确的命令。