인쇄할 공백이 포함되어 있고 따옴표로 묶인 결과를 찾습니다.

인쇄할 공백이 포함되어 있고 따옴표로 묶인 결과를 찾습니다.

인쇄할 공백(따옴표 쌍)이 find포함된 검색 결과를 포함하는 방법입니다 . ''이 결과에 공백이 포함된 경우에만 경로 문자열에 공백이 없으면 그대로 두십시오.

답변1

find귀하의 버전이 -printf를 지원하는 경우 다음 방법을 사용하여 이를 수행할 수 있습니다.

find . -name "* *" -printf "\"%p\"\n" -o -print

답변2

GNU 도구를 사용하여 CSV 출력을 생성한다고 가정해 보겠습니다.

find . -print0 | 
  LC_ALL=C sed -z '/[",[:space:]]/{s/"/""/g; s/.*/"&"/}' |
  tr '\0' '\n'

즉, 파일 이름에 하나 이상의 ", 또는 ASCII 공백 문자(SPC, TAB, CR 및 CSV의 모든 특수 개행 문자를 포함하되 이에 국한되지 않음)가 포함되어 있으면 다음 으로 ,변환됩니다. escape s )) 문자열을 큰따옴표로 묶습니다.""""

이 부분은 NUL을 레코드 구분 기호로 사용하여 수행됩니다. NUL은 파일 경로에 존재할 수 없는 유일한 바이트이기 때문입니다. 그런 다음 NUL을 개행 문자로 변환합니다 tr.

GNU가 아닌 시스템에서는 언제든지 다음을 사용할 수 있습니다 perl.

find . -print0 | perl -l -0 -pe 'if (/[",\s]/) {s/"/""/g; $_ = "\"$_\""}'

뒤쪽에

touch 'a b' $'a\nb' a,b a_b $'a\200b' 'a"b'

그들은 다음을 제공합니다:

.
"./a""b"
./a_b
"./a,b"
./a�b
"./a
b"
"./a b"

( 내 터미널은 \200유효한 문자를 형성하지 않는 바이트가 재생되는 UTF-8 로케일에 있습니다.)

제외 .하고 ./접두사를 지정 하려면 (GNU에만 해당되지만 ) -print0로 바꾸십시오 . 이것은 만든다:-mindepth 1 -printf '%P\0'-printf

"a""b"
a_b
"a,b"
a�b
"a
b"
"a b"

-print0또한 -mindepthGNU 확장이지만 이후 일부 다른 구현에 복사되었습니다. 귀하의 구현이 아직 구현되지 않은 몇 안 되는 구현 중 하나인 경우 다음을 대체할 수 있습니다.

  • find . -print0그리고find . -exec printf '%s\0' {} +
  • find . -mindepth 1 -printf '%P\0'그리고find . ! -name . -exec sh -c 'for i do printf "%s\0" "${i#./}"; done' sh {} +

답변3

출력을 다음으로 파이프하면 됩니다 awk.

find . | awk '/ /{ printf"\"%s\"\n", $0; next } { print }' 

관련 정보