15

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 的列表来提供我的程序,而不需要长路径名和文件扩展名。但是我不知道如何从那里开始!非常感谢任何提示!

4

3 回答 3

28

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

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

试试这个:

files=( /very/long/path/to/various/files/*.file )
for file in "${files[@]}"
do
  filename="${file##*/}"
  filenameWithoutExtension="${filename%.*}"
  echo "$filenameWithoutExtension"
done
于 2013-09-17T09:29:31.913 回答
9

解决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
于 2013-09-17T09:20:57.697 回答
3

像这样更简单:

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

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

progname -files "${files[*]}" -names "${names[*]}"
于 2013-09-17T13:17:34.580 回答