このリストを含む提供されたテキストファイルに基づいて、スペース(拡張子を無視)を含めることができるファイルを見つけます。

このリストを含む提供されたテキストファイルに基づいて、スペース(拡張子を無視)を含めることができるファイルを見つけます。

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.):グローバル修飾子:
  • Nullglob: 一致するものがない場合はエラーなし
  • Dotglob:隠しファイルも検索します。
  • .一致のみ定期的なファイル(例-type ffind

関連情報