在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的列表,以便在没有长路径名和文件扩展名的情况下提供我的程序。 但是我不清楚如何从那里开始!任何提示非常感谢!
答案 0 :(得分:26)
最好使用数组来保存文件名。字符串变量不会处理包含空格的文件名。
此外,您不需要使用basename
命令。而是使用bash的内置字符串操作。
试试这个:
files=( /very/long/path/to/various/files/*.file )
for file in "${files[@]}"
do
filename="${file##*/}"
filenameWithoutExtension="${filename%.*}"
echo "$filenameWithoutExtension"
done
答案 1 :(得分:6)
针对您的问题使用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”这样的文件名。在这种情况下,您将有两个(或多个扩展名)。然后,您可以使用更多的greddy运算符
for file in $files
do
file_name=$(basename $file)
file_name_witout_ext=${file_name%%.*}
done
答案 2 :(得分:3)
这样更简单:
files=(/very/long/path/to/various/files/*.file)
names=("${files[@]##*/}") names=("${names[@]%.*}")
progname -files "${files[@]}" -names "${names[@]}"
或者如果你只能将它们作为一个参数传递:
progname -files "${files[*]}" -names "${names[*]}"