Bash extracting file basename from long path
在
1 | files="/very/long/path/to/various/files/*.file" |
所以我可以这样使用它。
1 | prompt> program -files $files -names $namelist |
如果
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的列表,以便在没有长路径名和文件扩展名的情况下提供我的程序。但是我不知道怎么从那里开始!任何提示都非常感谢!
最好使用数组来保存文件名。字符串变量不会处理包含空格的文件名。
另外,您不需要使用
试试这个:
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[*]}" |