Shell-Script

剝離目錄路徑以獲取文件名

  • November 5, 2015

我正在做的是用 LAME 轉換 mp3。我已經有一個我寫的舊腳本,但我想添加這個功能 - 不再刪除文件,而是將它保存在一個新的根文件夾中,其子目錄與使用它已經存在的路徑匹配在。

這是我從 Internet 上獲得的程式碼,我在腳本中使用它來獲取路徑:

c=$FILENAME
xpath=${c%/*} 
xbase=${c##*/}
xfext=${xbase##*.}
xpref=${xbase%.*}
path=${xpath}
pref=${xpref}
ext=${xfext}

xpathpath我目錄結構/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

引用自:https://unix.stackexchange.com/questions/164125