uxs*_*-bw 6 strip shell-script file-descriptors filenames
我正在做的是用 LAME 转换 mp3。我已经有一个我写的旧脚本可以工作,但我想向它添加这个功能——不再删除文件,而是将它保存在一个新的根文件夹中,子目录与使用它已经存在的路径相匹配在。
这是我从 Internet 上获取的代码,我在脚本中使用它来获取路径:
c=$FILENAME
xpath=${c%/*}
xbase=${c##*/}
xfext=${xbase##*.}
xpref=${xbase%.*}
path=${xpath}
pref=${xpref}
ext=${xfext}
Run Code Online (Sandbox Code Playgroud)
在xpath和path给我的目录结构/home/user/working-root-directory/band-folder/album-name/
使用该技术,我如何编写脚本以将乐队文件夹放入单独的变量并将专辑文件夹放入单独的变量中?
然后我可以使用它们创建新文件夹,将所有 mp3 按乐队专辑顺序保存到不同的根文件夹中;这将使我不必自己移动它们,所以下次我运行我的脚本时,我不会再次对它们重新采样,因为它们将不再位于工作目录路径/文件夹中,并且仍然有我的文件的备份副本如果。
当提到文件名时,您的意思$c是文件的完整路径,那么这项工作真的很容易。有几种方法可以做到。
仅使用 POSIX shell globs 和参数扩展,您可以执行以下操作:
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%%/*}
Run Code Online (Sandbox Code Playgroud)
基本上它的工作原理是从变量的尾部修剪一个字符串,然后从变量的头部修剪结果。在最后一行中,尾巴上任何不需要的残留物都被剥离了。使用真实世界的数据可能更容易理解。如果你将上面的代码片段包装在一个set -x启用的 shell 中,你会看到沿着这些行打印的内容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
Run Code Online (Sandbox Code Playgroud)
执行此操作的另一种方法是使用 shell 的内部字段分隔符在/边界上拆分路径名。
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
Run Code Online (Sandbox Code Playgroud)
这是更多的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
Run Code Online (Sandbox Code Playgroud)