提取文件名的一部分?

Dar*_*ner 0 bash shell-script

我有一个格式如下的文件:

XXX XXXX XXX-6VwvOkZvzuI.description
Run Code Online (Sandbox Code Playgroud)

我怎样才能得到文件名XXX XXXX XXX?我试过了:

for file in $(ls .d*)
do
    fname="${file%*-}"
    ext="${filename%.*}"
done
Run Code Online (Sandbox Code Playgroud)

Kus*_*nda 6

不要解析输出ls(参见例如Why *not* parse `ls`(以及该怎么做)?)。您遇到的问题是,您的循环变量 ,file将在将文件名全部连接成一个长字符串后取值,然后在空格上拆分(以及在任何拆分单词之后)通配模式已扩展)。你会得到你的循环的三个迭代的文件名XXX XXXX XXX-6VwvOkZvzuI.description,例如,每一个的价值观XXXXXXXXXX-6VwvOkZvzuI.description

遍历名称中带有破折号的所有文件,然后是.description使用的文件名后缀

for name in *-*.description; do ...; done
Run Code Online (Sandbox Code Playgroud)

要挑选-in之前的部分$name,请使用标准参数扩展,删除-字符串中第一个之后的所有内容:

prefix=${name%%-*}
Run Code Online (Sandbox Code Playgroud)

using%%%here的区别在于删除%%最长匹配的尾字符串。如果-任何名称中碰巧有多个字符,这很重要。

你的循环然后变成

for name in *-*.description; do
    prefix=${name%%-*}
done
Run Code Online (Sandbox Code Playgroud)

文件名后缀是已知的 ( .description),但您可以-使用

infix=${name#"$prefix"}
infix=${infix%.description}
Run Code Online (Sandbox Code Playgroud)

最后,使用类似的脚本

#!/bin/sh

suffix=.description

for name in *-*"$suffix"; do
    prefix=${name%%-*}
    infix=${name#"$prefix"}
    infix=${infix%.description}

    printf 'prefix="%s", infix="%s", suffix="%s"\n' \
        "$prefix" "$infix" "$suffix"
done
Run Code Online (Sandbox Code Playgroud)

你会得到

$ ls
XXX XXXX XXX-6VwvOkZvzuI.description          XXX XXXX XXX-6VwvOkZvzuK.description
XXX XXXX XXX-6VwvOkZvzuJ.description          script
Run Code Online (Sandbox Code Playgroud)
$ ./script
prefix="XXX XXXX XXX", infix="-6VwvOkZvzuI", suffix=".description"
prefix="XXX XXXX XXX", infix="-6VwvOkZvzuJ", suffix=".description"
prefix="XXX XXXX XXX", infix="-6VwvOkZvzuK", suffix=".description"
Run Code Online (Sandbox Code Playgroud)