我有一个包含文件的目录,其中一些文件以下划线结尾。
我想测试每个文件以查看它是否以下划线结尾,然后剥离下划线。
我目前正在运行以下代码:
for file in *;do
echo $file;
if [[ "${file:$length:1}" == "_" ]];then
mv $file $(echo $file | sed "s/.$//g");
fi
done
但它似乎没有用下划线重命名文件。例如,如果我有一个名为all_indoors_
的文件,我希望它能给我all_indoors
。
答案 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),所以首先测试你是否选择了正确的命令。