使用bash提取文件夹名称

使用bash提取文件夹名称,bash,Bash,我有一系列的MP3放在这样的文件夹里 是否有一种方法可以使用sed获取文件夹名称 将basename与dirname组合: f="/mnt/media/Music1/DJ_Mixes_01-71/DJ aaa/01.mp3" d=$(dirname "$f") echo "$(basename "$d")" 为您提供DJ aaa您还可以使用参数扩展和子字符串提取作为“dirname/basename”的替代方案;下面是一个从数据文件读取所有目录名的快速示例: #!/bin/bash p

我有一系列的MP3放在这样的文件夹里

是否有一种方法可以使用sed获取文件夹名称


basename
dirname
组合:

 f="/mnt/media/Music1/DJ_Mixes_01-71/DJ aaa/01.mp3"
 d=$(dirname "$f")
 echo "$(basename "$d")"

为您提供
DJ aaa

您还可以使用参数扩展子字符串提取作为“dirname/basename”的替代方案;下面是一个从数据文件读取所有目录名的快速示例:

#!/bin/bash

printf "\n The following directories were isolated:\n\n"

while read -r line || test -n "$line" ; do

    pname="${line%/*}"      # remove filename from line
    lastd="${pname##*/}"    # remove up to last '/'

    printf " %-12s  from  %s\n" "$lastd" "$line"

done <"$1"

printf "\n"

exit 0
输出:

$ cat dat/mp3dirs.txt
/mnt/media/Music1/DJ_Mixes_01-71/DJ aaa/01.mp3
/mnt/media/Music1/DJ_Mixes_01-71/DJ 02/01.mp3
/mnt/media/Music1/DJ_Mixes_01-71/DJ Chemist/01.mp3
$ ./lastdir.sh dat/mp3dirs.txt

 The following directories were isolated:

 DJ aaa        from  /mnt/media/Music1/DJ_Mixes_01-71/DJ aaa/01.mp3
 DJ 02         from  /mnt/media/Music1/DJ_Mixes_01-71/DJ 02/01.mp3
 DJ Chemist    from  /mnt/media/Music1/DJ_Mixes_01-71/DJ Chemist/01.mp3
通过sed:

sed -r 's/.*\/(.*)\/.*$/\1/' file
通过awk:

awk -F/ '{print $(NF-1)}' file
通过grep:

grep -Po '.*\/\K.*(?=\/.*$)' file
直通式:

cut -d'/' -f6 file            # for fixed number of fields 

通过:


你可以像下面这样试试。
\(
\)
将标记从DJ到
/

sed 's#.*\(DJ [[:alnum:]]\{1,\}\)/.*#\1#g'
结果

DJ aaa
DJ 02
DJ Chemist

非常感谢Basilevs,这正是我要找的,您仍然需要引用
echo
语句中的命令替换:
echo“$(basename“$d”)”
,否则您的代码会受到路径名扩展的影响。如果您选择bash方式,另一个选项是使用
read
为您进行拆分:
IFS=/read-r-a行;做…
你会在
行[-2]
中得到你想要的目录部分。是的,我用了很多方法。我喜欢
-2
索引。这是我没有考虑的问题。在使用
for
循环进行处理时,我设置了
IFS
,但原因完全相反。谢谢你的评论。在你的
cut
解决方案中,你假设了固定数量的字段。这不好。@gniourf\u gniourf是的,但我不想在那里使用
rev
命令。但已更新:)
rev file |cut -d'/' -f2 |rev  # for any length of fields  
cuts -2 file
sed 's#.*\(DJ [[:alnum:]]\{1,\}\)/.*#\1#g'
DJ aaa
DJ 02
DJ Chemist