我试图根据前两个“|”实例之间的字符串更改文件名。这就是我的问题:
>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-rename
(rename
在许多系统上调用),您可以执行以下操作:
$ 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
实际重命名文件。