代码之家  ›  专栏  ›  技术社区  ›  a06e

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

  •  1
  • a06e  · 技术社区  · 10 年前

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

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

    我有兴趣获得没有最后扩展名的文件名(即。, file.txt ),以及父目录的名称( dir2 ,我不需要父目录的完整路径,只需要它的名称)。

    我怎样才能在bash中做到这一点?

    2 回复  |  直到 10 年前
        1
  •  3
  •   anubhava    10 年前

    使用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
    

    要将它们读入shell变量:

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

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

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

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