Shell-Script
剝離目錄路徑以獲取文件名
我正在做的是用 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/
使用該技術,我如何編寫腳本以將樂隊文件夾放入單獨的變數中,將專輯文件夾放入單獨的變數中?
然後我可以使用它們創建新文件夾,將所有 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
啟用的 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
您可以這樣做的另一種方法是使用 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
這是更多
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