根据文件的原始名称中字符的前两个实例之间的部分更改文件的名称

根据文件的原始名称中字符的前两个实例之间的部分更改文件的名称

我试图根据前两个“|”实例之间的字符串更改文件名。这就是我的问题:

>1234|兴趣1|随机数1.txt

>5678|兴趣2|randomstuff2.txt

>9101112|兴趣3|randomstuff3|trickything.txt

我想要的输出是:

兴趣1.txt

兴趣2.txt

兴趣3.txt

我已经在 bash 中使用正则表达式和变量尝试了一些东西,但无法达到我想要的结果。

非常感谢!

答案1

使用基于 Perl 的rename实用程序,重命名名称与模式匹配的所有文件*interest*.txt。通过在管道符号上拆分原始名称,然后使用第二个结果字段.txt添加到末尾来重命名每个文件:

rename -n -v '$_ = (split /\|/)[1] . ".txt"' *interest*.txt

-n确保命令输出正确的新名称后,删除该选项。

对问题中给出的名称进行测试:

$ ls -1
>1234|interest1|randomstuff1.txt
>5678|interest2|randomstuff2.txt
>9101112|interest3|randomstuff3|trickything.txt
$ rename -v '$_ = (split /\|/)[1] . ".txt"' *interest*.txt
>1234|interest1|randomstuff1.txt renamed as interest1.txt
>5678|interest2|randomstuff2.txt renamed as interest2.txt
>9101112|interest3|randomstuff3|trickything.txt renamed as interest3.txt
$ ls -1
interest1.txt
interest2.txt
interest3.txt

答案2

该脚本假设您要处理所有包含至少两个|字符并以.txt.问题中的示例文件名也将匹配*interest*.txt.如果您的要求不同,请在问题中澄清这一点。

如果输出符合您的预期,请删除echo前面的mv内容以实际重命名文件。注释# ...只是为了解释代码,可以省略。

for f in *\|*\|*.txt
do
    n="${f#*|}"  # remove leading shortest string matching *|
    n="${n%%|*}" # remove trailing longest string matching |*
    echo mv "$f" "$n".txt
done

答案3

我假设我们对以 开头>、包含(至少)两个分隔符 ( |) 并以 结尾的文件感兴趣.txt

例子

# Preparation
touch '>1234|interest1|randomstuff1.txt' '>5678|interest2|randomstuff2.txt' '>9101112|interest3|randomstuff3|trickything.txt'

# Process
for f in '>'*'|'*'|'*.txt
do
    x="${f#*|}"                      # Remove from start until first found '|'
    x="${x%%|*}.txt"                 # Remove from first found `|` to end

    printf "%s -> %s\n" "$f" "$x"    # Show what would happen
    # mv -f "$f" "$x"                # Do it (if uncommented)
done

输出(无mv

>1234|interest1|randomstuff1.txt -> interest1.txt
>5678|interest2|randomstuff2.txt -> interest2.txt
>9101112|interest3|randomstuff3|trickything.txt -> interest3.txt

取消注释mv移动文件的命令。请注意,如果您有重复的目标名称,则最后处理的目标名称将保留下来。

答案4

如果您有perl-renamerename在许多系统上调用),您可以执行以下操作:

$ rename -n 's/.*?\|(.+?)\|.*/$1.txt/' *txt 
>1234|interest1|randomstuff1.txt -> interest1.txt
>5678|interest2|randomstuff2.txt -> interest2.txt
>9101112|interest3|randomstuff3|trickything.txt -> interest3.txt

如果输出看起来像您想要的那样,请再次运行该命令,而无需-n实际重命名文件。

相关内容