击:在名称末尾删除号码。(Bash: remove numbers at the end of na

2019-07-20 01:37发布

我有这样的文件:外星人头骨2224154.jpg雪鸟红箭 - 雷鸟神机队 - 蓝 - 天使 - 43264.jpg死空间的相册 - 1053.jpg

“ - ”谢谢,我可以在bash名.jpg的ID总是由之前的字与分离之前删除“ID”字符串。

Answer 1:

下面是使用一种方法的bash参数替换 :

for i in *.jpg; do mv "$i" "${i%-*}.jpg"; done

或者更一般的情况下(即,如果您有其他文件扩展名),请尝试:

for i in *.*; do mv "$i" "${i%-*}.${i##*.}"; done

结果:

alien-skull.jpg
dead-space-album.jpg
snow-birds-red-arrows-thunderbirds-blue-angels.jpg

按下面的评论,试试这个bash脚本:

declare -A array

for i in *.*; do

    j="${i%-*}.${i##*.}"

    # k="$j"
    # k="${i%-*}-0.${i##*.}"

    for x in "${!array[@]}"; do

        if [[ "$j" == "$x" ]]; then
            k="${i%-*}-${array[$j]}.${i##*.}"
        fi
    done

    (( array["$j"]++ ))

    mv "$i" "$k"
done

请注意,您必须解除一个值k取决于你想如何格式化的文件名。 如果取消对第一线,只有重复的基本名称将递增:

dead-space-album.jpg
dead-space-album-1.jpg
dead-space-album-2.jpg
dead-space-album-3.jpg

如果取消对第二行,你会得到如下:

alien-skull-0.jpg
alien-skull-1.jpg
alien-skull-2.jpg
alien-skull-3.jpg


Answer 2:

假设所有文件的ID是数字,你可以使用重命名命令。

rename 's/-\d+//' *.jpg

这可能不是提供给每一个* nix的,所以这里是一个有用的链接选择: http://www.cyberciti.biz/tips/renaming-multiple-files-at-a-shell-prompt.html



Answer 3:

这是一个伟大工程的最终代码。 谢谢大家的时间!

for i in *.jpg; 
do

if [[  -e "${i%-*}.jpg" ]]; then
    num=1
    while [[ -e "${i%-*}-$num.jpg" ]]; do
        (( num++ ))
    done
 mv "$i" "${i%-*}-$num.jpg";

else 
rename 's/-\d+//' *.jpg
fi
 done


文章来源: Bash: remove numbers at the end of names.