xargs에 find를 파이핑하면 다른 위치에 있는 동일한 이름의 파일을 수정할 수 없습니다.

xargs에 find를 파이핑하면 다른 위치에 있는 동일한 이름의 파일을 수정할 수 없습니다.

Mac에서 GNU 도구 사용하기

무슨 일이 일어나고 있는지 잘 모르겠지만 xargs에 대한 find 출력을 파이핑하면 디렉터리 구조의 다른 위치에 나타나는 동일한 이름의 파일을 다루는 데 몇 가지 문제가 있는 것 같습니다.

내 디렉토리:

dir
-- dirone
---- myfile.txt
---- otherfile.txt
-- dirtwo
---- myfile.txt

이 명령을 실행하면 권한 거부 오류가 발생합니다.

find dir -name "myfile.txt" | xargs -0 -I FILE sh -c "ls FILE"

/ls 파일을 건드릴 수도 없습니다. "otherfile.txt"가 포함된 "otherfile.txt"에 액세스하면 아무런 문제가 없습니다.

find dir -name "otherfile.txt" | xargs -0 -I FILE sh -c "ls FILE"

어떤 종류의 경쟁 조건이 있습니까? 결국에는 이 파일을 수정하고 싶지만 sed -i수정할 수도 없습니다. 이해가 안 돼요. 전체 파일 경로가 xargs에 전달되기 때문에 전체 경로가 있어야 하고, 같은 이름으로 만드는 것은 중요하지 않죠?

편집: 좋습니다. 권한 오류가 발생하는 이유를 여전히 이해하지 못하지만 다음은 작동하는 것 같습니다.

find dir -name "otherfile.txt" -type file -print0 | xargs -0 -I FILE sh -c "ls FILE"

그냥 삭제 -0해도 작동합니다. 어떤 방법이 더 좋고/안전한지 잘 모르겠습니다.

답변1

디렉토리 설정을 고려하면 다음과 같습니다.

$ find dir
dir
dir/dirtwo
dir/dirtwo/myfile.txt
dir/dirone
dir/dirone/myfile.txt
dir/dirone/otherfile.txt

귀하의 (원래) 명령을 사용하면 원래 문제를 재현할 수 있습니다.

$ find dir -name "myfile.txt" | xargs -0 -I FILE sh -c "ls FILE"
dir/dirtwo/myfile.txt
sh: line 1: dir/dirone/myfile.txt: Permission denied
$

무슨 일이 일어나고 있는지 더 잘 이해하기 위해 다음 명령을 변형해 보겠습니다.

$ find dir -name "myfile.txt" | xargs -0 -I FILE echo -FILE-
-dir/dirtwo/myfile.txt
dir/dirone/myfile.txt
-

FILE은 다음으로 확장됩니다.하나의토큰: dir/dirtwo/myfile.txt\ndir/dirone/myfile.txt\n.왜요? 스위치를 xargs사용하여 태그를 NUL로 구분하도록 지시했고 -0두 파일 이름 사이에 NUL 문자가 없기 때문입니다.

따라서 원래 명령으로 돌아가면 ... | xargs -0 -I FILE sh -c "ls FILE"다음과 같습니다.

ls dir/dirtwo/myfile.txt
dir/dirone/myfile.txt

그래서 하나를 나열하고 두 번째 것을 실행하려고 시도합니다. 이것이 "권한 거부됨" 메시지가 나타나는 이유입니다. 두 번째 파일은 실행 가능하지 않습니다.

발견한 대로 옵션을 추가하면 성공 -print0했습니다 . find이 옵션을 사용하면 find토큰 사이에 NUL 문자가 배치됩니다. 이는 xargs이 옵션을 사용할 -0때 예상되는 것과 동일한 문자입니다 . 다시 말하지만, -0옵션을 끄는 것만으로도 문제가 해결됩니다. 왜냐하면 와 는 xargs기본적으로 구분 기호로 공백을 사용하기 때문입니다.findxargs

-print0옵션은 -0파일 이름에 공백이 포함될 수 있는 경우에 유용합니다(이로 인해 토큰 구분 기호로 처리되는 공백의 기본 동작이 중단됩니다).

관련 정보