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
.
또한보십시오: