파일 이름을 다른 프로그램으로 파이프하고 싶지만 이름에 공백이 있으면 모두 질식합니다.
파일이 있다고 가정 해 봅시다.
foo bar
find
올바른 이름을 반환하려면 어떻게 해야합니까?
분명히 나는 원한다.
foo\ bar
또는:
"foo bar"
편집 : 통과하고 싶지 않아 xargs
, find
파일 이름 문자열을 다른 프로그램으로 직접 파이프 할 수 있도록 올바른 형식의 문자열을 가져오고 싶습니다 .
find
파일 이름의 형식을 정확하게 지정합니다. 그들은 한 줄에 하나의 이름으로 작성됩니다. (물론, 파일 이름에 줄 바꿈 문자가 포함되어 있으면 모호합니다.) 따라서 문제는 공백이 생겼을 때 수신 끝 "질식"입니다. 즉, 의미있는 답변을 원할 경우 수신 끝이 무엇인지 알려 주어야합니다. .
find
파일 이름을 쉘에 적합한 형식으로 출력하는 옵션을 제공하는 것이 합리적입니다 . 그러나 일반적으로 -print0
GNU find
확장은 다른 많은 시나리오에서도 잘 작동하므로 어떤 경우에도 사용하는 방법을 배워야합니다.
ls $(command...)
목록을 통해 피드하지 않습니다 stdin
. $(command...)
명령 행 에 직접 출력을 넣습니다 . 이 경우 c에서 읽는 쉘이며 현재 값을 사용 $IFS
하여 출력을 워드 분할하는 방법을 결정합니다. 일반적으로을 사용하는 것이 좋습니다 xargs
. 성능 저하를 느끼지 못할 것입니다.
find -printf '"%p"\n'
찾은 각 이름 주위에 큰 따옴표를 추가하지만 파일 이름에 큰 따옴표를 올바르게 인용하지 않습니다. 파일 이름에 큰 따옴표가 포함되어 있지 않으면 문제를 무시하거나 다음을 통해 파이프 할 수 있습니다 sed 's/"/&&/g;s/^""/"/;s/""$/"/'
. 파일 이름이 셸에 의해 처리되는 경우 큰 따옴표 대신 작은 따옴표를 사용해야합니다 (그렇지 sweet$HOME
않으면와 같음 sheet/home/you
). 그리고 이것은 줄 바꿈이있는 파일 이름에 대해서는 여전히 강력하지 않습니다. 어떻게 처리하고 싶습니까?
-exec
와 플래그 를 알고find
있습니까? 잠재적으로이 오류를 완화하고-exec
다른 명령으로 파이프 하는 대신 명령을보다 효율적으로 수행 할 수 있습니다. 그냥 내 $ .02