sed는 필요한 모든 bash 이스케이프를 파일 경로에 삽입합니다.

sed는 필요한 모든 bash 이스케이프를 파일 경로에 삽입합니다.

sed사람이 읽을 수 있는 파일이나 디렉터리 경로(표준 터미널에 표시되거나 출력에 표시됨)를 bash 인수*로 사용할 수 있는 명령으로 변경하는 명령을 찾고 있습니다. find예를 들어 문자열 My Books/Pride & Prejudice.pdfMy\ Books/Pride\ \&\ Prejudice.pdf.

\현재는 Very 또는 space 앞에 공백을 삽입하고 있지만 &, 다양한 극단적인 경우에 이런 일이 발생할 것이라고 생각합니다. 그래서 좀 더 일반적인 해결책이 있는지 궁금합니다.

*이 문제의 가장 일반적인 버전은 아마도 불가능할 것입니다. 임의의 프로그램에서 처리할 인수로 경로를 전달하는 경우(예: 추가 sed조작) 각 프로그램마다 다른 이스케이프 모델이 필요할 수 있습니다. 하지만 저는 출력을 경로로 직접 사용하고 싶습니다. 예를 들어 cd거기로 가거나 호출하는 것과 같습니다 cat.

답변1

printf '%q\n' 'My Books/Pride & Prejudice.pdf'원하는 결과를 얻을 것입니다. 예를 들어 glob 모드를 사용하여 printf '%q\n' *여러 파일에 대한 결과를 얻을 수 있습니다.

사용 사례에 따라 find+exec이스케이프 없이 조합을 사용할 수 있습니다. 예를 들어 일치하는 파일 이름이 명령 find -type f -name '*.txt' -exec cat {} +에 올바르게 전달됩니다 .cat

또는 파일 이름에 작은따옴표나 개행 문자와 같은 문제가 되는 문자가 없으면 수동으로 파일 이름을 작은따옴표로 묶고 다른 명령에 전달할 수 있습니다. 예를 들어:ls -l 'My Books/Pride & Prejudice.pdf'

관련 정보