find의 exec 함수 사용하기

find의 exec 함수 사용하기

for루프에서 다음을 수행 하려고합니다 .

  • 기준을 충족하는 파일 찾기
  • 파일 이름을 로그 파일에 에코합니다.
  • 파일을 압축합니다.

스크립트가 파일을 찾고 그 이름을 화면에 표시하도록 할 수 있지만 파일로 파이프할 수는 없습니다. (아직 gzip 부분은 테스트해보지 않았습니다)

다음은 스크립트의 관련 부분입니다( $LOGCLEAN_FILE스크립트의 이전 부분에 존재하고 작성되었습니다).

for F in `find . -type f \( ! -name '*.gz' \) -a \( ! -name '*.Z' \) -mtime +7`
do

        {
        print "Will be compressing file  ${F}" >> $LOGCLEAN_FILE
        } ; 
        ##gzip $F
done

텍스트 없이 스크립트를 실행하면 " >> $LOGCLEAN_FILE"출력이 화면에 나타납니다.

내가 뭘 잘못했나요?

비판을 환영합니다. 저는 아직 배우는 중입니다.

답변1

find실제로 쉘 루프에서 출력을 재현할 필요는 없습니다 . 포장하고 싶다면파일 이름 목록, 일반 공식은 다음과 같습니다.

find ... | gzip > logfile.gz

압축하고 싶다면파일 자체, 그러면 다음과 같이 됩니다:

find ... | tar -czvf archive.tar.gz -T -

처리할 파일 이름 목록(각각 표준 입력을 나타냄) tar을 파일에서 읽도록 지시합니다 . -( -TAKA --files-from=옵션은 GNU tar 에 존재합니다. 다른 버전은 잘 모르겠습니다.) 물론 \n이름이 포함된 파일을 처리하면 이 옵션이 중단됩니다.

답변2

find 출력을 안정적으로 사후 처리할 수 없습니다. 사용 -exec:find

find . -type f ! -name '*.gz' ! -name '*.Z' -mtime +7 -exec sh -c '
  for i do
    printf "%s\n" "Will be compressing file $i"
    gzip "$i"
  done' sh {} + >> log

GNU 구현을 사용하면 findsh를 실행하지 않고도 탈출할 수 있습니다.

find . -type f ! -name '*.gz' ! -name '*.Z' -mtime +7 \
  -printf 'Will be compressing file %p\n' -exec gzip {} + >> log

답변3

>>다음과 같이 루프( after ) 외부에 리디렉션( )을 배치합니다 done.

for i in $(find . -type f \( ! -name '*.gz' \) -a \( ! -name '*.Z' \) -mtime +7);
  do echo "Will be compressing file  ${i}";
  ##gzip $i;
done >> $LOGCLEAN_FILE

또는 최종적으로 명령의 주석 처리를 제거하려는 경우 다음 gzip을 고려할 수 있습니다.

for i in $(find . -type f \( ! -name '*.gz' \) -a \( ! -name '*.Z' \) -mtime +7);
  do gzip "$i" && echo "Successfully compressed ${i}";
done >> $LOGCLEAN_FILE

이전 명령이 오류 없이 종료된 경우 이는 &&다음 명령을 실행한다는 의미입니다.0

답변4

출력 파일로 파이프하려는 경우 파일 경로를 반복합니다...

find의 exec 함수 사용하기

...반복을 처리하세요.

expand서브셸을 통해 명시적인 파일 목록을 반복하고 출력을 stdout으로 호출하여 각 개별 파일을 덮어쓰고 싶습니다 .이 답변으로 해결된 문제.

find $(git ls-files | grep '.py$') \
    -exec bash -c 'expand -t 4 "$0" > /tmp/e && mv /tmp/e "$0"' {} \;

이 스레드의 다른 답변은 일반적인 솔루션을 제공하지 않았기 때문에 이 답변의 약간 수정된 버전을 다시 게시하고 있습니다. 이것이 내가 본 유일한 방법이며 파일 경로를 반복할 때만 작동합니다.

find를 사용하여 해당 이름을 반복할 수 있도록 반복된 항목의 이름을 딴 파일을 생성하는 것을 오용하는 솔루션을 상상할 수 있습니다.


실패한 시도:

bash -c ...find exec 호출과 마찬가지로 for 루프 내에서 사용해 보았습니다 . 하지만 빈 출력 파일에서도 동일한 문제가 발생합니다.

면책 조항: 내 문제가 정확히 무엇인지 잘 모르겠습니다. find exec를 사용하기 전의 모든 시도에서 내가 기록할 것으로 예상되는 모든 출력 파일을 덮어쓰고, 내 문제는 나중에 빈 파일이라는 것입니다.

관련 정보