私がやっていることは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
答え2
私はzsh
これを行うために次の人を雇うでしょう:
$ c='/home/user/working-root-directory/band-folder/album-name/filename.mp3'
$ echo $c:h
/home/user/working-root-directory/band-folder/album-name
$ echo $c:h:h
/home/user/working-root-directory/band-folder
$ echo $c:h:h:h
/home/user/working-root-directory
(...)
$ echo $c:t
filename.mp3
$ echo $c:h:t
album-name
$ echo $c:h:h:t
band-folder
(...)
Bashを使用して人生をより困難にする必要がある場合は、一時変数を使用する必要があります。
$ c='/home/user/working-root-directory/band-folder/album-name/filename.mp3'
$ x1=${c%/*}
$ echo $x1
/home/user/working-root-directory/band-folder/album-name
$ x2=${x1%/*}
$ echo $x2
/home/user/working-root-directory/band-folder
(...)
$ y1=${c##*/}
$ echo $y1
filename.mp3
$ y2=${x1##*/}
$ echo $y2
album-name
$ y3=${x2##*/}
$ echo $y3
band-folder
(...)
答え3
以前の解決策は私にとってとても複雑に見えました。私の考えでは、これが最も簡単な解決策です。
Bashからファイル名文字列のディレクトリ名を取得する
dirname "$varcontainingfilename"
Bashのファイル名文字列から一意のファイル名を取得するには、次のようにします。
basename "$varcontainingfilename"
これに基づいて、必要なことを簡単に行うことができなければなりません。
このシェルスクリプトをscript/a/b/cとして実行する例は次のとおりです。
#!/bin/sh
set -u
PATH='/bin:/usr/bin'
export PATH
filestring="$1"
fn=`basename "$filestring"`
dn=`dirname "$filestring"`
echo Original File String "$filestring"
echo Filename is "$fn"
echo directory is "$dn"
exit 0
答え4
Zshはよりエレガントなソリューションですただし、それがシェルでない場合は、次のものを使用できますawk
。
printf "%s\n" "$path"
/home/user/working-root-directory/band-folder/album-name/music-file.mp3
band=$(awk -F/ '{print $(NF-2)}' <(printf "%s" "$path"))
printf "%s\n" "$band"
band-folder
album=$(awk -F/ '{print $(NF-1)}' <(printf "%s" "$path"))
printf "%s\n" "$album"
album-name
file=$(awk -F/ '{print $NF}' <(printf "%s" "$path"))
printf "%s\n" "$file"
music-file.mp3