Bash从长路径中提取文件basename

Bash从长路径中提取文件basename,bash,filenames,glob,Bash,Filenames,Glob,在bash中,我试图glob一个目录中的文件列表,作为程序的输入。然而,我也想给这个程序的文件名列表 files="/very/long/path/to/various/files/*.file" 所以我可以这样使用它 prompt> program -files $files -names $namelist 如果glob给我: /very/long/path/to/various/files/AA.file /very/long/path/to/various/files/BB.f

bash
中,我试图
glob
一个目录中的文件列表,作为程序的输入。然而,我也想给这个程序的文件名列表

files="/very/long/path/to/various/files/*.file"
所以我可以这样使用它

prompt> program -files $files -names $namelist
如果
glob
给我:

/very/long/path/to/various/files/AA.file /very/long/path/to/various/files/BB.file /very/long/path/to/various/files/CC.file /very/long/path/to/various/files/DD.file /very/long/path/to/various/files/ZZ.file
我想获得AA BB CC DD ZZ的列表,以便在没有长路径名和文件扩展名的情况下为我的程序提供数据。
然而,我不知道如何从那里开始!任何暗示都非常感谢

使用
basename
解决您的问题

for file in $files
do
  file_name=$(basename $file)
  file_name_witout_ext=${file_name%.file}
done
编辑(无(单个)扩展名提取文件名的通用方法)

另一种可能发生的情况是使用类似“archive.tar.gz”的文件名。在这种情况下,您将有两个(或多个)扩展名。然后可以使用更灰色的运算符

for file in $files
do
  file_name=$(basename $file)
  file_name_witout_ext=${file_name%%.*}
done

最好使用数组来保存文件名。字符串变量不会处理包含空格的文件名

此外,您不需要使用
basename
命令。而是使用bash的内置字符串操作

试试这个:

files=( /very/long/path/to/various/files/*.file )
for file in "${files[@]}"
do
  filename="${file##*/}"
  filenameWithoutExtension="${filename%.*}"
  echo "$filenameWithoutExtension"
done

这样比较简单:

files=(/very/long/path/to/various/files/*.file)
names=("${files[@]##*/}") names=("${names[@]%.*}")
progname -files "${files[@]}" -names "${names[@]}"
或者,如果您只能将它们作为单个参数传递:

progname -files "${files[*]}" -names "${names[*]}"

+1您可以更一般地使用
filename\u,而不使用扩展名=“${filename%.*}”
,这可能是一件好事。我只是坚持操作参数。你能给我一个参考,从那里我可以阅读所有这些字符串匹配格式…你能至少解释一下为什么不应该使用basename吗?那个字符串操作模式实际上做了什么/匹配了什么?基本上是循环的
progname -files "${files[*]}" -names "${names[*]}"