使用bash提取文件夹名称
我有一系列的MP3放在这样的文件夹里 是否有一种方法可以使用sed获取文件夹名称使用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
将
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