私はスクリプトを作成していますが、ファイル名を別のものと比較して、特定の変更点を探す必要があります(この場合は、OS Xがファイルを追加する必要があるときに "ディレクトリに、ファイル名が既に存在する場合)、これはスクリプトの抜粋であり、残りの部分はテストせずに変更されています。ワイルドカードとファイル名の比較
#!/bin/bash
p2_s2="/Path/to file (name)/containing - many.special chars.docx.gdoc"
next_line="/Path/to file (name)/containing - many.special chars.docx (1).gdoc"
file_ext=$(echo "${p2_s2}" | rev | cut -d '.' -f 1 | rev)
file_name=$(basename "${p2_s2}" ".${file_ext}")
file_dir=$(dirname "${p2_s2}")
esc_file_name=$(printf '%q' "${file_name}")
esc_file_dir=$(printf '%q' "${file_dir}")
esc_next_line=$(printf '%q' "${next_line}")
if [[ ${esc_next_line} =~ ${esc_file_dir}/${esc_file_name}\ \(?\).${file_ext} ]]
then
echo "It's a duplicate!"
fi
私がここでやろうとしているのは、ファイルnext_lineがp2_s2の複製であるかどうかを検出することです。私は複数の重複を期待しているので、next_lineは、ファイル名の末尾に(1)を付けるか、括弧内に他の数字を付けることができます(二重の数字はありません)。真ん中のワイルドカードと単純な文字列を比較することができないので、 "=〜"演算子を使用してすべての特殊文字をエスケープしようとしました。私が間違っていることは何か考えていますか?
申し訳ありませんが、hhisは従来のPEBKACでした。私がテスト用に実際に作成したエントリを置き換えたためです。残念ながら、私のテストスクリプトは.docxの後と.gdocの前に、 "(1)"が正しく配置されています。 –
のように解釈されますが、 "set -x"を追加すると、何が間違っているのかを明らかにします: $ {esc_file_dir}/$ {esc_file_name} \\(?\)$ {file_ext} ' は '/Path/to \ file \ gothoc' ではなく、 '/パス/ファイル\へ\(名前\)/を含む\ - \ many.special \ charsを含む名前\ .docx \\(?\).gdoc' しかし、追加のバックスラッシュを1つ追加すると構文エラー(duh)が発生し、さらに2つを追加すると、次の出力が生成されます。 '/ Path/to \ file \(name \)/ - \ many.special \ chars.docx \\ \(?\)。gdoc' これを修正する方法はありますか? –
変数にファイル名を作成し、 '=〜'テストでそれを使用します(引用符で囲まれていない)。それが役立つかどうかを見てください。 bashは長年にわたって '=〜'のRHSにさまざまな引用/エスケープ問題を持っていました。 –