从bash中的完整文件路径获取不带扩展名的父目录名和文件名?

从bash中的完整文件路径获取不带扩展名的父目录名和文件名?,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%/

我有一个很长的文件路径,比如

 /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:

要将它们读入shell变量,请执行以下操作:

read folder file < <(awk -F '/' '{sub(/\.[^.]+$/, "", $NF);print $(NF-1), $NF}'<<<"$s")
使用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:

要将它们读入shell变量,请执行以下操作:

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

第一部分可以通过basename1解决:

$ basename /path/to/file/dir1/dir2/file.txt.gz
file.txt.gz
$ 
dirname1的作用正好相反,这并不是您想要的,但也许您可以将其作为起点:

$ 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
$ 

第一部分可以通过basename1解决:

$ basename /path/to/file/dir1/dir2/file.txt.gz
file.txt.gz
$ 
dirname1的作用正好相反,这并不是您想要的,但也许您可以将其作为起点:

$ 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
$ 

我不知道那是什么意思。您能否将结果(dirname和文件名,不带最后扩展名)存储到两个变量(file和folder)中?这样我可以用它做一些有用的事情。谢谢。我也用BASHism更新了答案。你可以用:file=${p%.*}和folder=${d*/}代替上面的echo语句。我不知道这是什么意思。您能否将结果(dirname和文件名,不带最后扩展名)存储到两个变量(file和folder)中?这样我可以用它做一些有用的事情。谢谢。我也用BASHism更新了答案。您可以使用:file=${p%.*}和folder=${d*/}代替上面的echo语句。