我正在做的是用LAME转换mp3。我已经写了一个可以工作的旧脚本,但是我想添加此功能-不再删除文件,而是将其保存在新的根文件夹中,该子文件夹的子目录与使用该文件的路径已经匹配在。
这是我在脚本中使用Internet以获得路径的代码:
c=$FILENAME
xpath=${c%/*}
xbase=${c##*/}
xfext=${xbase##*.}
xpref=${xbase%.*}
path=${xpath}
pref=${xpref}
ext=${xfext}
在xpath
和path
给我的目录结构/home/user/working-root-directory/band-folder/album-name/
使用该技术,我该如何编写脚本以仅将band-folder放入一个单独的变量中,而将album-folder放入一个单独的变量中?
然后,我可以使用它们创建新文件夹,使所有mp3保持在乐队专辑顺序中,以将它们放入另一个根文件夹中。这将使我不必自己移动它们,因此,下次运行脚本时,我将不会再次对其进行采样,因为它们将不再位于可使用的目录路径/文件夹中,并且仍然具有我文件的备份副本以防万一。
当指代文件名时,您的意思$c
是文件的完整路径,那么此工作确实非常容易。有几种方法可以做到这一点。
仅使用POSIX Shell Glob和参数扩展,您可以执行以下操作:
c='/home/user/working-root-directory/band-folder/album-name/music-file.mp3'
file=${c##*/}
album=${c#*"${c%/*/"$file"}"/}
band=${c#*"${c%/*/"$album"}"/}
band=${band%%/*} album=${album%%/*}
基本上,它的工作原理是从变量的尾部修剪一个字符串,然后从变量的头部修剪结果。在最后一行中,从尾部清除掉所有不需要的残留物。使用现实世界的数据可能更容易理解。如果您将上述代码段包装在set -x
启用了功能的外壳中,则会看到以下内容stderr
:
+ c=/home/user/working-root-directory/band-folder/album-name/music-file.mp3
+ file=music-file.mp3
+ album=album-name/music-file.mp3
+ band=band-folder/album-name/music-file.mp3
+ band=band-folder
+ album=album-name
您可能执行此操作的另一种方法是使用外壳程序的内部字段分隔符在/
边界上拆分路径名。
set -f; IFS=/ #disable globbing so as not to gen more filenames
set -- $c #set the shell's arg array to split path
shift "$(($#-3))" #remove all but relevant fields
band=$1 album=$2 file=$3 #assign values
这是更多set -x
输出:
+ c=/home/user/working-root-directory/band-folder/album-name/music-file.mp3
+ set -f
+ IFS=/
+ set -- '' home user working-root-directory band-folder album-name music-file.mp3
+ shift 4
+ band=band-folder
+ album=album-name
+ file=music-file.mp3
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句