큰 디렉터리에 있는 모든 zip 파일을 반복하여 개별적으로 압축을 푸는 스크립트가 있습니다. -q 옵션을 사용하여 콘솔을 깨끗하게 유지하고 다른 모니터링 정보를 표시합니다.
동일한 동작을 유지하되 전체 작업에 대한 단일 로그 파일에 -v 옵션의 출력을 추가하고 싶습니다. 이를 달성하는 가장 좋은 방법은 무엇입니까? 그런데 저는 아직 스크립팅이 처음이라 어떤 의견이라도 감사히 받아들일 것입니다.
스크립트 부분의 압축을 풉니다.
for FILES in $(ls -1Sr|grep a_media*)
do unzip -q $FILES -d $DESTINATION
done
답변1
전체 루프를 stdout
리디렉션 할 수 있습니다 .stderr
for FILES in $(ls -1Sr|grep a_media*)
do unzip -q "$FILES" -d "$DESTINATION"
done > log 2>&1
적어도 zsh
최신 버전 bash
에서는 .> log 2>&1
>& log
귀하의 ls
처리가 의심스럽습니다. 다음을 참조하세요.왜 `ls`를 구문 분석하지 *않나요*?...
답변2
먼저, 경로에 공백이 포함되어 있으면 명령이 중단되므로 명령에서 $FILES
및 $DESTINATION
변수를 큰따옴표로 unzip
묶는 것이 좋습니다 unzip
. 또한 ls
개행 문자가 포함된 "원시" 파일 이름이 파이프로 출력되므로 스크립트가 중단됩니다. 개행 문자가 포함된 파일 이름에는 bash
대신 globbing 함수를 사용하세요 for FILES in /path/to/archives/* [...]
.
unzip
둘째, 일반 출력을 억제하는 이 옵션을 사용하지 않고 실행하면 -q
작성되는 출력 stdout
(STDandard OUTput)은 일반적으로 터미널 화면에 연결된 파일입니다. 셸은 bash
명령의 출력을 stdout
다른 파일로 리디렉션할 수 있습니다. bash
각각 및 연산자를 통해 수행됩니다. 1. 파일을 생성하거나(존재하지 않는 경우) 파일을 잘라낸 다음 출력을 파일에 추가합니다. 2. 파일을 생성하거나(존재하지 않는 경우) 출력을 문서에 추가합니다. .>
>>
따라서 이 경우에는 여러 아카이브를 처리하므로 새 파일을 처리할 때마다 로그 파일을 자르는 대신 기존 로그에 수정 내용을 포함하여 새 출력을 추가하고 싶습니다.
for FILES in /path/to/archives/*
do
unzip -v "$FILES" -d "$DESTINATION" >> /path/to/logfile
done