Bash 从长路径提取文件基本名称

4 浏览
0 Comments

Bash 从长路径提取文件基本名称

在bash中,我正在尝试从目录中联通一组文件来作为程序输入,但我还想把这个文件列表提供给这个程序

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列表,以便将其提供给我的程序,而不包括长路径名和文件扩展名。 但我没有头绪!任何提示将不胜感激!

admin 更改状态以发布 2023年5月22日
0
0 Comments

使用basename命令解决您的问题

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

编辑(提取无扩展名文件名的通用方法)

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

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

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

0
0 Comments

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

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

尝试这个:

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

0