ファイル名を取得するためのディレクトリパスの削除

ファイル名を取得するためのディレクトリパスの削除

私がやっていることはLAMEを使ってmp3を変換することです。動作する古いスクリプトを作成しましたが、この機能を追加したいと思います。ファイルを削除するのではなく、そのファイルを使用して、すでに存在するサブディレクトリがある新しいルートフォルダに保存します。パスは 。

これはインターネットから得られたコードで、スクリプトからパスを取得するために使用されます。

 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をバンドアルバムの順序で別のルートフォルダに保存する新しいフォルダを作成できます。これにより直接移動する必要がなくなり、次回スクリプトを実行したときに勝ちました。これは作業ディレクトリのパス/フォルダに存在しないため、再サンプリングされず、場合によってはファイルのバックアップコピーを保持し続けます。

ベストアンサー1

$c次の場合に参照するときファイル名ファイルのフルパスを意味する場合、操作は本当に簡単です。これを行う方法はいくつかあります。

POSIXシェルグローブとパラメータ拡張のみを使用して、次のことができます。

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

おすすめ記事