在 Linux Shell 中将部分文件名存储为变量

在 Linux Shell 中将部分文件名存储为变量

当前文件名:017251004_2301941_5193716.xml 需要编号:5193716

_我需要将最后一个之后和之前的数字存储.xml到一个变量中。有人可以提供相同的语法吗?

我尝试了这个,num="${file:19:7}" 但它在某种程度上有效,因为我有 400 万个文件,所以在获取一些文件后,它没有获得全名。

当前代码:

for file in "$origin"/*.xml
do
    [ -f "$file" ] || continue    # In case there are no files to copy
        name=${file%.*}               # Strip extension
        name=${name##*/}              # Strip leading path
        save="${name}_$dt.xml"        # Backup filename with datetime suffix

        num="${file:19:7}"

echo "Copying file from Server A to Server B"
        scp -C -- "$file" "$username@$ip:$destination"
done

答案1

是的,很容易,就像这样:

#!/bin/bash
# test wrapper
file="017251004_2301941_5193716.xml"
num=$(basename "$file" ".xml" | cut -d_ -f3)
printf "file=$file,num=$num\n"
exit 0

当然,读man basename cut

答案2

您已经拥有可迭代$file文件集的代码:

name=${file%.*}               # Strip extension
name=${name##*/}              # Strip leading path

如果此时插入调试行,您将看到其中name包含不带扩展名的文件名.xml

echo "# file=$file, name=$name #" >&2

例如,name=017251004_2301941_5193716。从这里开始bash,再次使用模式匹配工具来提取最后一个分隔的元素就很简单了_

fieldNum=${name##*_}          # Extract last `_`-separated field value

我认为您值得花时间阅读man bash有关以下内容的部分:参数扩展${parameter#word},特别是描述和${parameter%word}(以及它们的加倍##和变体)的部分%%。您可以直接在 shell 中进行实验 - 无需脚本 - 使用这些命令及其其他变体

f=/path/to/my.file.txt
echo "Strip trailing parts: '${f%/*}' and '${f%.*}' and '${f%%.*}'"
echo "Strip leading parts: '${f#*/}' and '${f##*/}' and '${f##*.}'"

相关内容