删除文件路径和扩展名,只保留文件名

删除文件路径和扩展名,只保留文件名

我有一个文件路径/home/test/domain/example.txt ,它的长度和文件扩展名也可以完全不同。例如:

/reallylongpath/example/longername.vb

我需要删除扩展名“.”之后,我需要删除除文件名以外的所有内容。上面的两个例子我需要examplelongername

我假设要转到最后一次出现的“/”,但不确定。

我希望使用 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

相关内容