"-exec"를 사용하여 "find" 명령의 출력을 실행하는 방법은 무엇입니까?

"-exec"를 사용하여 "find" 명령의 출력을 실행하는 방법은 무엇입니까?

이것은 내 이전 질문과 관련이 있습니다 [AWK를 사용하여 항상 특정 자릿수로 출력을 인쇄하는 방법.

이제 다음 명령이 생겼습니다. 목표는 특정 요소에 따라 여러 파일을 다른 디렉터리에 복사하는 것입니다.

find . -mtime -5 -type f -name '*data.txt' -printf "cp -p %p "/tmp/HTTPBackup/"%Td"/"\n"

이 출력은 다음과 같습니다.

cp -p ./32982_96xxdata.txt /tmp/HTTPBackup/09/
cp -p ./32312_96xxdata.txt /tmp/HTTPBackup/11/
cp -p ./32191_96xxdata.txt /tmp/HTTPBackup/07/

이제 이 모든 줄을 화면에 인쇄하려면 어떻게 해야 합니까? 유지 -printf하고 추가합니까 -exec?

전임자:

find . -mtime -5 -type f -name '15692_96xxdata.txt' -printf "cp -p %p "/tmp/HTTPBackup/"%Td"/"\n" -exec {} \;

작동하지 않습니다. 644 권한이 있는 파일을 소유하고 있음에도 불구하고 권한 거부에 대해 불평합니다. 간단한 복사본을 사용하면 됩니다.

cp -p ./15692_96xxdata.txt /tmp/http_backups/09/
find: ‘./15692_96xxdata.txt’: Permission denied

아니면 어떻게든 -printf교체할까요 -exec? 이것을 시도하는 방법을 잘 모르겠습니다.

감사합니다!

답변1

% 확장 뒤에 -p이를 %p명령 /tmp/HTTPBackup/%Td에 대한 별도의 인수로 전달해야 합니다 cp. xargsNUL로 구분된 인수(0은 파일 경로나 실행된 명령 인수에 나타날 수 없는 유일한 바이트 값)를 인쇄하는 경우 이를 사용하여 1을 안전하게 분할할 수 있습니다.

find . -name '*data.txt' -mtime -5 -type f \
  -printf '-p\0%p\0/tmp/HTTPBackup/%Td/\0' |
  xargs -r0 -n3 cp

또는:

find . -name '*data.txt' -mtime -5 -type f \
  -printf '%p\0/tmp/HTTPBackup/%Td/\0' |
  xargs -r0 -n2 cp -p

HTTPBackup1 전역적으로 쓰기 가능한 디렉토리 내에서 고정된 이름(예:)을 가진 디렉토리를 사용하는 것은 안전하지 않을 수 있습니다 /tmp.

답변2

일반적인 답변을 얻기 위해 질문에 대한 몇 가지 의견을 인용했습니다.

.pipe 를 추가하여 쉘에 파이프하면 됩니다 | sh. 확인하고 싶은 사항:

find . -mtime -5 -type f -name '*data.txt' -printf "cp -p %p "/tmp/HTTPBackup/"%Td"/"\n" | sh
  • (1)은  -exec {}" .txt파일을 스크립트로 실행"을 의미합니다. 그렇기 때문에 권한 오류가 발생합니다. 파일에 대한 실행 권한이 없습니다 .txt. -exec {}파일이 스크립트가 아닌 경우에는 사용하지 마십시오. 사용하기 전에 수행 중인 작업에 대해 신중하게 생각하십시오.
  • find(2) sh모든 파일 이름이 "정상"인 경우, 즉 _문자, 숫자 및 .. 파일 이름에 특이한 문자가 포함되어 있으면 실패할 수 있으며 심지어 해로울 수도 있습니다.

관련 정보