Linuxツールについての知識が不足しているため、苦労しています。私のファイルのリストにスペース(スペース文字)が含まれているので、 "find"コマンドはヒットエントリを見つけることができませんが、エラーを生成しません。このスクリプトを使用する理由は、音楽や映画など、以前にトランスコードされたファイルを(再)トランスコードするのに役立ちます。
searchdir="/volume2/"
filename='list-in.txt'
n=1
while read line; do
echo "# $n : $line"
FILES=${line%.*}
find ${searchDir} -iname "$FILES.*" -type f
n=$((n+1))
done < $filename
変数処理を扱うawkまたはsedの例がほとんどないことがわかったので、ここから始めるべきかどうかわかりません。
入力ファイルには、次の形式のファイル名が含まれます。
Supertramp [The Very Best Of Supertramp] -05- Breakfast In America.m4a
Supertramp [The Very Best Of Supertramp] -07- Take The Long Way Home.m4a
Supertramp [The Very Best Of Supertramp] -09- Dreamer.m4a
引用符の区切り文字やパスはありません。
スクリプトの出力は、上記のリストと最もよく一致するパスとファイル名になります。ソースファイルと結果ファイルのファイル拡張子は異なります。
/volume2/music/Supertramp/1990. The Very Best Of Supertramp/Supertramp [The Very Best Of Supertramp] -05- Breakfast In America.flac
/volume2/music/Supertramp/1990. The Very Best Of Supertramp/Supertramp [The Very Best Of Supertramp] -07- Take The Long Way Home.flac
/volume2/music/Supertramp/1990. The Very Best Of Supertramp/Supertramp [The Very Best Of Supertramp] -09- Dreamer.flac
答え1
zsh シェルの使用:
set -o extendedglob
searchdir=/volume2
filename=list-in.txt
names=( ${(f)"$(<$filename)"} )
files=( $searchdir/**/(#i)(${(~j[|])names:r}).*(ND.) )
print -rC1 -- $files
ここでは、大文字と小文字を区別しない一致を有効にするだけでなく、おおよその(#i)
一致を有効にすることもできます。たとえば、(#a2)
最大2つのエラー(省略、挿入、転置、その他の文字)までの一致が許可されます。
$(<file)
拡張コンテンツfile
。 IFSが文句を言うのを防ぐためにここに引用されました。${(f)expansion}
行から拡張を分割しますf
。${file:r}
r
ファイルのootnameに展開されます(拡張子は削除されます)。配列に適用すると、すべての要素に適用されます。${(j[|])array}
j
配列要素を追加するために使用されます|
。の場合、グローバル演算子(交互)として扱われます~
。|
**/
サブディレクトリのすべてのレベル(レベル0を含む)と一致します。(ND.)
:グローバル修飾子:N
ullglob: 一致するものがない場合はエラーなしD
otglob:隠しファイルも検索します。.
一致のみ定期的なファイル(例-type f
)find
。