2016-04-15 14 views
3

私はスクリプトを作成していますが、ファイル名を別のものと比較して、特定の変更点を探す必要があります(この場合は、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)を付けるか、括弧内に他の数字を付けることができます(二重の数字はありません)。真ん中のワイルドカードと単純な文字列を比較することができないので、 "=〜"演算子を使用してすべての特殊文字をエスケープしようとしました。私が間違っていることは何か考えていますか?

答えて

1

あなたは「sの拡張子next_lineトリム」ps2_s2をトリミング括弧内の拡張子を含む数と同じファイル名を取得するかどうかを確認することができます。あなたがそうするなら、それは重複している。そうするために、[[は、文字列とGlobの比較を実行します。

私はextglobのパターン+(...)を使用しました。したがって、+([0-9])を使用してかっこ内の数字と一致させることができます。 extglobshopt -s extglobによって有効になっていることに注目してください。

#!/bin/bash 

p2_s2="/Path/to/ps2.docx.gdoc" 
next_line="/Path/to/ps2(1).docx.gdoc" 

shopt -s extglob 
if [[ "${p2_s2%%.*}" = "${next_line%%\(+([0-9])\).*}" ]]; then 
    printf '%s is a duplicate of %s\n' "$next_line" "$p2_s2" 
fi 

編集:私は今、このソリューションは十分でない場合にはので、あなたは、あなたの質問を編集したことがわかり

、私はで動作するように良いテンプレートだろうというポジティブです。

0

next_line(1)は、それが元のファイル名の最後の.に2つ目の前に来ていますが、唯一の拡張機能として単一.を剥ぎ最終.前に付属していません。

したがって、比較ファイル名を生成すると、期待通りに一致しない/Path/to\ file\ \(name\)/containing\ -\ many.special\ chars.docx\ \(?\).gdocになります。

スクリプトの先頭にset -xを追加した場合、シェルが実際にやっていたことを見て、これを見ているは​​ずです。

この状況でOS Xは実際に何をしていますか?それは.gdoc? Does it add it before .docx`の前に(#)を追加しますか? OS X のファイル名を知っているかどうか(ネイティブで開くことができる何らかのタイプ)に依存しますか?

+0

申し訳ありませんが、hhisは従来のPEBKACでした。私がテスト用に実際に作成したエントリを置き換えたためです。残念ながら、私のテストスクリプトは.docxの後と.gdocの前に、 "(1)"が正しく配置されています。 –

+0

のように解釈されますが、 "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' これを修正する方法はありますか? –

+0

変数にファイル名を作成し、 '=〜'テストでそれを使用します(引用符で囲まれていない)。それが役立つかどうかを見てください。 bashは長年にわたって '=〜'のRHSにさまざまな引用/エスケープ問題を持っていました。 –

関連する問題