特定のディレクトリにファイル名を持つファイルがあります。ただし、一部のファイル名は次のとおりです。
- 元のファイル名の空白を下線で置き換えます(したがって、
directory/file with spaces
入力ファイルでも空白になります)。file_with_spaces
- 実際には、ディレクトリ内のファイルと一致しない可能性があります。
これら2つの条件がない場合は、cat inputfile | awk 'commands'
ファイルに目的のコマンドを適用するために使用します。ただし、ファイル名が見つからないエラーをキャッチする方法が必要です。
- 一致するファイルが見つかるまで、下線をスペースに置き換えるさまざまな組み合わせを試してください。
- アンダースコアを空白に置き換えた後でも、一致しないファイルのリストを提供します。
これを行うための良い方法はありますか? 1行のコマンドではなく特定の種類のスクリプトが必要なようですが、解決策を考えるのに十分なシェルスクリプトに慣れていません。
ベストアンサー1
私が使用したアプローチは、lsの出力を取得して変換された名前を元の名前にマップする配列を設定し、入力ファイルの各行を処理することでした。入力が配列にある場合は配列の値を出力し、それ以外の場合は入力行をファイルに追加しますmissing
。したがって、ファイルに入れるように変更して引数としてdirectory
実行します。inputfile
#!/usr/bin/awk
# set up an array t of translations
BEGIN {
while (("ls" | getline )>0) {
k=$0
gsub(/ /,"_")
if ($0 in t) {
print "$0 matches more than one file" > /dev/stderr
exit(2)
}
t[$0]=k
}
close("ls")
}
{ if ($0 in t) {
print t[$0]
} else {
print $0 > "../missing"
}
}