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
。
また見なさい: