我需要設定我的bash 批次作業(就地壓縮5.1k 個檔案),這樣如果我需要停止/恢復作業,它將等到它位於「檔案之間」(剛剛完成一個檔案並且尚未啟動另一個檔案) 。
pigz -9 -- rsnc*
如果全部同時運行,我的壓縮看起來會像這樣,我正在考慮類似的事情:
ls rsnc* | while read file
do pigz -9 -- $file
if [ -f .intr ]
then break
fi
done
這是實現我的目標的可靠方法嗎?有沒有更好的辦法?
答案1
你可以trap
[1],[2]Ctrl +訊號C,INT 訊號,以及wait
每個行程的結束。
#!/bin/bash
trap ctrl_c INT
function ctrl_c() {
wait # wait for the end of all child processes
exit # <<--- put here your exit code exit 1, ...
}
shopt -s nullglob
for f in rsnc*
do
pigz -9 -- $file & # Execute in background
wait $! # Wait for the end of the last command
done
筆記
有很多方法可以循環遍歷目錄中的所有檔案[3],但它總是最好避免解析輸出ls
[4]。
參考
- 在 Bash 中捕獲 ctrl-c,一個簡單的例子。
- 陷阱摘自 Bash 初學者指南 - 第 12 章。
- Bash 循環遍歷文件。
- 最好的一些原因避免解析 ls 輸出。