我有一个文件路径/home/test/domain/example.txt
,它的长度和文件扩展名也可以完全不同。例如:
/reallylongpath/example/longername.vb
我需要删除扩展名“.”之后,我需要删除除文件名以外的所有内容。上面的两个例子我需要example
和longername
。
我假设要转到最后一次出现的“/”,但不确定。
我希望使用 bash 来做到这一点。
答案1
对于固定扩展,basename
可以使用该实用程序来执行此操作:
$ f=/home/test/domain/example.txt
$ basename -- "$f" .txt
example
但由于您有任意扩展名,因此您需要显式选择要传递给的最后一个扩展名basename
。 shell 的参数扩展可以在这里使用:
$ basename -- "$f" ".${f##*.}"
example
或者,当我们这样做时,使用参数扩展来进行这两种删除。
$ x="${f##*/}"; x="${x%.*}"; echo "$x"
example
${var##pattern}
删除var
最长的前缀匹配pattern
。 With %%
it 采用后缀代替,并使用一个#
或%
最短的前缀或后缀。
如果您考虑.txt.gz
删除诸如单个扩展之类的内容,您可以使用x="${x%%.*}"
(带有 double %%
)来代替。
请注意,如果给定路径以 结尾,最后一个解决方案将给出一个空字符串作为输出/
,同时basename
会忽略尾部斜杠。另一种需要注意的情况是目录名称也可以包含点,例如/home/test/domain.orig/example.txt.gz
, 或文件名根本不包含点。 (我没有仔细检查所有这些情况。)
相关问题的讨论参见:
答案2
basename /reallylongpath/example/longername.vb |cut -d"." -f1
编辑:如果是“.”,这将失败在文件名中。然而
basename /reallylongpath/example/lo.ngername.vb |rev| cut -d"." -f2- |rev
将为您提供正确的
lo.ngername