인쇄할 공백(따옴표 쌍)이 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
또한 -mindepth
GNU 확장이지만 이후 일부 다른 구현에 복사되었습니다. 귀하의 구현이 아직 구현되지 않은 몇 안 되는 구현 중 하나인 경우 다음을 대체할 수 있습니다.
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 }'