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
을 파일에서 읽도록 지시합니다 . -
( -T
AKA --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 구현을 사용하면 find
sh를 실행하지 않고도 탈출할 수 있습니다.
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를 사용하기 전의 모든 시도에서 내가 기록할 것으로 예상되는 모든 출력 파일을 덮어쓰고, 내 문제는 나중에 빈 파일이라는 것입니다.