bashスクリプトはファイル名を[と]と正しく比較しません。

bashスクリプトはファイル名を[と]と正しく比較しません。

ファイルを処理するbashスクリプトがあります。findあるディレクトリのすべてのファイルと別のディレクトリの各ファイル名を検索します。これを行うには、次を使用します。

"${myfiletobesearched}"

スクリプト内部。ただし、ファイル名に[または]が含まれている場合、ファイルのコピーがあっても、スクリプトは2番目のディレクトリにそのファイルを見つけません。ファイル名を同じように認識させるにはどうすればよいですか?

問題の範囲を例に絞ることができました。

myfile="My File [Official Awesome File].txt"
find ./ -name "${myfile}" -type f

その名前のファイルがあっても出力は提供されません。\[もちろん文を書いたり、そういうことです。オプションではありませんmyfile小切手ディレクトリで発生するためです。

スクリプトは次のとおりです。https://gist.github.com/Make42/5bdae5e4de32cff0d01c9486b09383ee

答え1

myfile="My File [Official Awesome File].txt"
myfile=$(echo $myfile | sed -r 's/(\[|\])/\\\1/g')    
find ./ -name "${myfile}" -type f

これが機能していることを確認できますか?

myfile私はこれが次の値に変わると予想しました。

myfile="My File \[Official Awesome File\].txt"

より良い方法は以下を使用することですprintf

myfile=$(printf '%q\n' "$myfile")

具体的な例では、find次のようになります。

find ./ -name "$(printf '%q\0' "$myfile")" -type f

答え2

主張を探して- 名前パラメータはグローバルモード、一つでもないファイル名角括弧はグローバルパターンメタ文字です。

この問題を解決するために私が見つけた1つの方法は、パターンの代わりに正確な文字列一致を使用するインラインPerlスクリプトを使用することです。

myfile="My File [Official Awesome File].txt"
perl -MFile::Find -le 'find( sub {
  return unless $_ eq $ARGV[0];
  print $File::Find::name;
}, $ARGV[1] )' "${myFile}" .

関連情報