나는 cp에서 이상한 동작을 관찰했습니다. 정확하게 말하자면, 대화형 옵션이 있음에도 불구하고 cp는 나에게 확인을 요청하지 않았습니다.
테스트 예시는 다음과 같습니다
기존 파일
find * -type f
app/file.txt
test/file.txt
올바른 행동
/usr/bin/cp -ip test/file.txt app/
cp: overwrite app//file.txt (yes/no)? yes
잘못된 행동
find test/ -type f | while read line; do /usr/bin/cp -ip $line app/; done
두 번째 경우에는 왜 cp
메시지가 표시되지 않습니까?
답변1
while 루프의 단순성을 고려하면 xargs
이를 작업에 사용하는 것이 더 합리적입니다. test/
디렉토리가 눈에 띌 만큼 충분히 큰지는 의심스러울지라도 속도도 더 빨라야 합니다 .
find test/ -type f -print0 |xargs -o0 cp -ipt app/
-t
이것은 GNU 확장이라는 점에 유의하십시오 . 이것이 문제가 된다면 다음과 같은 것이 필요합니다(GNU로 이 작업을 수행하려면 a로 xargs
변경하세요 ):-J
-I
find test/ -type f -print0 |xargs -o0 -J % cp -ip % app/
파일 이름에 공백이 있어도 작동하도록 find -print0
사용 했습니다 .xargs -0
xargs
문제의 루프가 이런 방식으로 실행 되면 while
표준 입력이 소비되므로 터미널(단말기, /dev/tty
) 보장할 수 없습니다.
상호 작용을 허용하기 위해 각 하위 프로세스에서 xargs -o
표준 입력을 다시 여는 데 사용됩니다 /dev/tty
. 이는 GNU xargs와 BSD xargs 모두에서 사용할 수 있지만아니요Busybox xargs 또는 기타 기본 프레임워크POSIX xargs.
xargs(1)에 대한 GNU findutils 매뉴얼 페이지에서:
-o
,--open-tty
/dev/tty
명령을 실행하기 전에 하위 프로세스에서와 같이 stdin을 다시 엽니다. 이는 대화형 애플리케이션을 실행 하려는 경우에 유용합니다xargs
.…
이
-o
옵션은 BSD와의 호환성을 높이기 위해 POSIX 표준을 확장한 것입니다.