获取父目录名称和文件名,但没有扩展名从完整的文件路径在bash中?

问题描述:

我有很长的文件路径,像获取父目录名称和文件名,但没有扩展名从完整的文件路径在bash中?

/path/to/file/dir1/dir2/file.txt.gz 

我感兴趣的是得到的文件名没有最后延伸(即file.txt)和父目录(dir2的名字,我不想父目录的完整路径,只是它的名字)。

如何在bash中做到这一点?

使用bash:

s='/path/to/file/dir1/dir2/file.txt.gz' 

file="${s##*/}" 
file="${file%.*}" 
echo "$file" 
file.txt 

filder="${s%/*}" 
folder="${folder##*/}" 
echo "$folder" 
dir2 

使用awk

awk -F '/' '{sub(/\.[^.]+$/, "", $NF); print $(NF-1), $NF}' <<< "$s" 
dir2 file.txt 

读取它们到壳变量:

read folder file < <(awk -F '/' '{sub(/\.[^.]+$/, "", $NF);print $(NF-1), $NF}'<<<"$s") 
+0

我不知道这意味着什么。你能将结果(dirname和文件名没有最后的扩展名)存储到两个变量中:'file'和'fol​​der'吗?这样我可以做一些有用的事情。谢谢。 – becko 2015-02-09 19:50:37

+0

我也用BASHism更新了答案。您可以使用:'file =“$ {p%。*}”''和'fol​​der =“$ {d ## * /}”'而不是上面的'echo'语句。 – anubhava 2015-02-09 19:53:08

第一部分可以通过基名来解决(1):

$ basename /path/to/file/dir1/dir2/file.txt.gz 
file.txt.gz 
$ 

目录名(1)则正好相反,这是不太你想要什么,但也许你可以使用它作为起点:

$ dirname /path/to/file/dir1/dir2/file.txt.gz 
/path/to/file/dir1/dir2 
$ 

当然,你可以随时使用Perl:

$ perl -E 'do { @p=split m|/|; say $p[-2] } for @ARGV' /path/to/file/dir1/dir2/file.txt.gz 
dir2 
$