首页 > 解决方案 > 提取路径内容/文件名组件 (BASH)

问题描述

我有文件名,我试图从中提取名称/单词/数字以供以后使用。

例如

/.../Penguins_45_MIA.txt
/.../Sheep_3.5_KIA.txt
/.../Dolphins_19_AWOL.txt

如您所见,文件名中有下划线分隔的组件,这对我很有用。我将它们放在一个数组(“ currentpath”)中,然后进入一个循环,一次处理每个文件(我认为这是一种非常明智的方法?)。我一直在尝试使用以下命令将路径分解为其组成单词和数字:

partialpath=(${currentpath//_/})

然后选择名称的一部分(现在是一个元素),例如使用以下内容的动物:

${partialpath[-3]}

但这不起作用 - 我一直希望上面的回声会给我一个DolphinsPenguins等等。当我调查时,echo "${partialpath[@]}"返回:

/.../Dolphins19AWOL.txt

所以我假设数组只有一个元素?也就是说,整个文件路径都粘在一起,没有任何下划线?还是我错误地选择了元素?

另外,我刚刚注意到最后一个元素仍然会使.txt文件以最后一个元素结尾,这将是次优的。

我希望这很清楚,我知道这是一个简单的问题,但我对编写脚本完全陌生,而且我整天都在摸不着头脑。

标签: arraysbashloopspathfilenames

解决方案


${currentpath//_/} just removed the underscores, it doesn't break the string up. It can be used on arrays, but just does the same string manipulation on each element. Try this:

$: cat x
/.../Penguins_45_MIA.txt
/.../Sheep_3.5_KIA.txt
/.../Dolphins_19_AWOL.txt

while read line
do tmp="${line##*/}" # remove ALL path stuff from the line 
   tmp="${tmp%.*}"   # remove JUST LAST piece after a dot
   IFS="_" read -a chunk <<< "$tmp"; # split on underscores
   printf "%10s " "${chunk[@]}"; printf "\n"; 
done < x
  Penguins         45        MIA
     Sheep        3.5        KIA
  Dolphins         19       AWOL

推荐阅读