关于文件名:bash从长路径提取文件basename

Bash extracting file basename from long path

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

1
files="/very/long/path/to/various/files/*.file"

所以我可以这样使用它。

1
prompt> program -files $files -names $namelist

如果glob给我:

1
/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 d d zz的列表,以便在没有长路径名和文件扩展名的情况下提供我的程序。但是我不知道怎么从那里开始!任何提示都非常感谢!


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

另外,您不需要使用basename命令。相反,使用bash的内置字符串操作。

试试这个:

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


关于你的问题的解决方案

1
2
3
4
5
for file in $files
do
  file_name=$(basename $file)
  file_name_witout_ext=${file_name%.file}
done

编辑(提取不带(单个)扩展名的文件名的通用方法)

1
2
3
4
5
for file in $files
do
  file_name=$(basename $file)
  file_name_witout_ext=${file_name%.*}
done

另一个可能发生的事情是文件名为"archive.tar.gz"。在这种情况下,您将有两个(或多个扩展名)。你可以用一个更好的接线员

1
2
3
4
5
for file in $files
do
  file_name=$(basename $file)
  file_name_witout_ext=${file_name%%.*}
done


这样简单:

1
2
3
files=(/very/long/path/to/various/files/*.file)
names=("${files[@]##*/}") names=("${names[@]%.*}")
progname -files"${files[@]}" -names"${names[@]}"

或者,如果只能将它们作为单个参数传递:

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