cp 및 대화형은 덮어쓰기 전에 메시지를 표시하지 않습니다.

cp 및 대화형은 덮어쓰기 전에 메시지를 표시하지 않습니다.

나는 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 표준을 확장한 것입니다.

관련 정보