나는 한동안 이러한 문제를 겪고 있습니다. 나는 다양한 것을 시도했지만 소용이 없었습니다.
답변1
here-document(here-doc의 내용을 문자 그대로 이해할 수 있도록 여기에 구분 기호를 인용함)를 사용하여 .
입력하는 것이 더 쉽습니다 .
xargs -d'\n' touch -- << '.'
\*\\'"Best School"\'\\*$\?\*\*\*\*\*:)
.
(여기서 GNU를 가정 xargs
) 또는:
touch -- "$(cat << '.'
\*\\'"Best School"\'\\*$\?\*\*\*\*\*:)
.
)"
그리고 ksh
또는 zsh
,
touch -- "$(<< '.'
\*\\'"Best School"\'\\*$\?\*\*\*\*\*:)
.
)"
또한 유효하며 mksh
효과적으로 최적화로서 여러 줄 인용 형식으로 간주될 수 있습니다. 바라보다Bash의 파일 읽기 명령 대체 이해더 알아보기.
쉘 rc
또는 파생물 또는 zsh
그 이후 set -o rcquotes
:
touch '\*\\''"Best School"\''\\*$\?\*\*\*\*\*:)'
이름을 작은따옴표로 묶고 작은따옴표를 이스케이프하면 됩니다 ''
.
답변2
간단히
touch "\\\*\\\\'\"Best School\"\\'\\\\\*\$\\\?\\\*\\\*\\\*\\\*\\\*:)"
파일 이름은 따옴표와 백슬래시 사용을 알고 있음을 나타내므로 이 작업은 쉬울 것입니다. 그러나 일반적인 이름을 사용하는 것이 더 나을 것이므로 프로세스/워크플로를 다시 생각해 보십시오.
답변3
sh
예를 들어 호환 가능한 셸 에서는 bash
전체 문자열을 작은따옴표로 묶은 다음 각 내부 작은따옴표를 '\''
( 또는 )로 바꿉니다.'"'"'
touch -- '\*\\'\''"Best School"\'\''\\*$\?\*\*\*\*\*:)'
각 내부 시퀀스는 '\''
일시적으로 외부 작은따옴표 문자열을 분리하고 이스케이프된 작은따옴표를 삽입한 다음 작은따옴표 문자열을 계속합니다.
작은따옴표로 묶인 문자열에는 작은따옴표를 포함할 수 없기 때문에 이는 필요합니다.
여기에 참조된 문서를 사용할 수도 있습니다.
touch -- "$(cat <<'END_NAME'
\*\\'"Best School"\'\\*$\?\*\*\*\*\*:)
END_NAME
)"
cat
이는 여기에서 문서 리디렉션의 문자열을 전달하는 데 사용됩니다 . 문서(이 경우 한 줄)는 명령 대체의 결과로 전달되며 'END_NAME'
초기 문서 구분 기호( )에 대한 참조로 인해 문서가 확장에 작용하는 것을 방지하므로 쉘은 해당 내용을 방해하지 않습니다.
(어쨌든 예제 문자열에는 유효한 확장이 없지만 여기에 문서를 인용하면 일반 문자열에서 변수나 명령 대체처럼 보이는 확장을 피할 수 있습니다.)
답변4
올바른 파일 이름을 인쇄하는 변수가 있는지 확인하십시오. 그런 다음 변수를 터치합니다. 이 명령을 사용하기 전에 파일 이름을 얻기 위해 필요한 만큼 printf를 사용할 수 있습니다 touch
.
$ var='\*\\'\''"Best School"\'\''\\*$\?\*\*\*\*\*:)'
$ printf '%s\n' "$var"
\*\\'"Best School"\'\\*$\?\*\*\*\*\*:)
$ touch "$var"
아마도:
$ var=$'\*\\\\\'"Best School"\\\'\\\\*$\\?\\*\\*\\*\\*\\*:)';echo "$var"
\*\\'"Best School"\'\\*$\?\*\*\*\*\*:)
또는 변수 내에서 올바른 값을 얻는 다른 방법.