
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
기본적으로 구분 기호로 공백을 사용하기 때문입니다.find
xargs
-print0
옵션은 -0
파일 이름에 공백이 포함될 수 있는 경우에 유용합니다(이로 인해 토큰 구분 기호로 처리되는 공백의 기본 동작이 중단됩니다).