Shell脚本通过从初始名称中删除子字符串来重命名文件

ut6juiuv  于 2023-04-21  发布在  Shell
关注(0)|答案(4)|浏览(139)

需要一个Bash shell脚本,通过从文件名中删除两个点之间包含的可变长度子字符串(包括第一个点)来重命名多个文件。第一个示例:初始文件名为“AAAAAAAA.BBBBB-BBB.jpg”,最终文件名为“AAAAAAAA.jpg”--删除子字符串“.BBBBB-BBB”。第二个示例:初始文件名为“mmmmmmmmmm.vvv-yyyy.txt”,最终文件名为“mmmmmmmm.txt”--删除子字符串“.vvv-yyyyy”。
我的脚本不断将文件扩展名追加到初始名称。我正在Windows Surface笔记本电脑上使用CYGWIN。

#!/bin/bash
for file in *.jpg *.txt; do
  if [[ $file == *.*-*.* ]]; then
    new_file=${file%%.*.*-*}.${file##*.}
    mv "$file" "$new_file"
  fi
done
uajslkp6

uajslkp61#

问题出在第一种模式上
尝试一个更简单版本的模式,以削减前缀部分

#!/bin/bash
for file in *.jpg *.txt; do
  if [[ $file == *.*-*.* ]]; then
    new_file=${file%%.*-*.*}.${file##*.}
    mv "$file" "$new_file"    
    #                             
  fi
done
km0tfn4u

km0tfn4u2#

使用Perl的rename

rename -n 's/\.[^-]+-[^-]+(?=\.)//' AAAAAAAA.BBBBB-BBB.jpg 
rename(AAAAAAAA.BBBBB-BBB.jpg, AAAAAAAA.jpg)

删除-n开关,又名 * 试运行 * 当您的尝试是令人满意的重命名为真实的的

正则表达式匹配如下:
节点解释
\.我的天
[^-]+任何字符,除了:-(1次或多次(匹配最大可能量))
-- -
[^-]+任何字符,除了:-(1次或多次(匹配最大可能量))
(?=look ahead查看是否存在:
\.我的天
)先行结束
8fsztsew

8fsztsew3#

for file in *.*-*.{jpg,txt}}; do
    new_file=$(echo $file | sed 's/\.[^.]\+\././')
    mv "$file" "$new_file"
done
li9yvcax

li9yvcax4#

检查下面的代码。
从您的问题中提取的示例文件名。
AAAAAAAA.BBBBB-BBB.jpg
mmmmmmmmmm.vvv-yyyyy.txt

验证码:

#!/bin/bash

for file in `ls *.*.{txt,jpg}`
    do
        mv $file $(echo $file | awk -F "." '{print $1"."$NF}')
    done

输出:

# ls -rt | tail -2
mmmmmmmmmm.txt
AAAAAAAA.jpg

相关问题