スペースを含むsedファイル名に無効なオプションエラーがあります。

スペースを含むsedファイル名に無効なオプションエラーがあります。
 BASE_NAME="$(basename "${1}")"
 FILE_NEW="$(echo "${BASE_NAME}" | sed -e "${REPLACE}")"

ここで、$ 1はREPLACE変数関数に渡されたファイル名を表します。

REPLACE='s/\[NOW\]/'${NOW}'/g;s/\[TODAY\]/'${TODAY}'/g;s/\[DATETIME\]/'${DATETIME}'/g;s/\[RANDOM\]/'${RANDOM_NUMBER}'/g;s/\[NAME\]/'${NAME}'/g;s/\[FILENAME\]/'${FILENAME}'/g'

私がしたいのは、上記のパターンを置き換えてsed演算子を使用してファイル名を変更することです。ただし、「-」の後にスペースを含むファイルを見つけると問題が発生します。たとえば、次のファイル名を見てください。

file -2.txt
file -3.txt
file -e.txt

これらすべての場合に発生するエラーは次のとおりです。

sed: invalid option -- '2'
sed: invalid option -- '3'
sed: -e expression #1, char 1: unknown command: `.'

ファイル名にスペースのみが含まれており、「-」が含まれていない場合でも問題があります。

file name.txt

次のエラーが発生します。

sed: can't read ./file: No such file or directory
sed: can't read name.txt: No such file or directory

スクリプトの完全なコード:フルスクリプト

答え1

エラーはスクリプトの次の行で発生します。

sed -i $REPLACE $1

これはREPLACE、変数と$1引用符のない変数の両方を使用します。つまり、シェルはこれらの単語をスペース、タブ、および改行の単語に分割します(その後、これらの単語のファイル名のグロービングパターンをさらに処理します)。それではこの言葉が与えられるでしょう。別のパラメータとして到着するsed

あなたは使用して逃げることができます

sed -i -e "$REPLACE" -- "$1"

また、関数に引用されていない変数がありますclone_directory

  rename_file ${dir_name}
  ROOT=$FILE_NEW
  cd $ROOT

そしてreplace_tags関数でも({...}通常は変数名を使用する必要はありません。いいえ参照変数と同じです)。

また、シェルオプションは関数に対してローカルではないため、設定するとグローバルにextglob設定されますget_file_folder_name

また見なさい:

関連情報