저는 bash 스크립팅을 처음 접했지만 사용해야 합니다.
디렉터리를 반복하여 모두 원격 서버에 업로드하고 싶습니다. 그런 다음 삭제해야합니다.
이제 내가 가진 문제는 다음과 같습니다. tcpdump가 이 디렉토리에 pcap 데이터를 (회전된 파일과 함께) 쓰고 있으므로 최신 파일을 업로드하고 싶지 않습니다. 디렉터리를 반복할 때 최신 디렉터리를 100% 건너뛰도록 하려면 어떻게 해야 합니까? 파일을 생성하고 업로드하는 과정이 병렬로 진행되기 때문에 업로드가 시작되는 순간 '새로운' 최신 파일이 있을 수도 있습니다. 최신 파일 2개 업로드를 건너뛰어도 괜찮지만 지금은 최신 파일을 업로드하고 싶지 않습니다.
"일반" 루프에 대한 솔루션을 읽어서 bash 스크립팅을 배우려고 하는데 구문이 매우 혼란스럽습니다. 따라서 시작점에 대해 도움을 주거나 초보자가 할 수 있는 부분 솔루션을 알려주시면 감사하겠습니다. 이해하다.
감사합니다!
추신: 최신 파일에는 최신 타임스탬프도 있습니다.
답변1
셸을 사용 하고 업로드 명령이 명령줄의 목록으로 모든 파일과 함께 zsh
호출된다고 가정합니다 .upload
upload ./*(.Dom[2,-1])
glob 한정자 (.Dom[2,-1]))
는 앞의 globbing 패턴( *
)이 일반 파일( .
glob 한정자를 사용하고 D
glob 한정자를 사용하여 숨겨진 파일을 포함)만 일치하도록 하며 패턴 확장에는 최근 수정된 파일이 포함되지 않습니다( om
셸에 파일 정렬을 지시함). 수정 시간까지 Poke는 파일을 정렬하고 [2,-1]
결과 목록의 첫 번째 파일을 제외한 모든 파일을 선택합니다.
그런 다음 동일한 패턴을 사용하여 전송된 파일을 삭제하거나 루프를 사용할 수 있습니다.
for name in ./*(.Dom[2,-1]); do
upload $name
rm -f $name
done
이는 공백, 탭 또는 줄 바꿈이 포함된 파일 이름을 포함하여 모든 유형의 파일 이름을 처리해야 합니다.
답변2
ls의 -t 옵션을 사용하면 수정을 기준으로 파일을 정렬할 수 있습니다. tail 명령과 함께 사용하면 첫 번째 파일을 제외한 모든 파일을 인쇄할 수 있습니다. 이 같은:
ls -t | tail -n +2
루프에서는 다음과 같이 보일 수 있습니다.
for my_file in $(ls -t | tail -n +2); do upload $my_file; rm $my_file; done
답변3
# find the latest file
latestf="$(ls -t /directory/*|head -1)";
# loop over files now
for f in /directory/* ; do
if [[ "${f}" == "${latestf}" ]];then
echo "skipping file [${f}]";
else
echo "processing file [${f}]";
# your upload cmd here
fi
done