Bash
bash 一次執行 X 個參數的命令
我有一個儲存在 txt 文件中的文件列表。
./test7 ./test4 ./test1 ./test5 ./test6 ./test10 ./test8 ./test2 ./test9 ./test3
我想對所有這些文件執行一個命令,但我想在每兩個文件處理完後休眠 1 秒,例如:
cp ./test1 test1-backup cp ./test2 test2-backup sleep 1 cp ./test3 test3-backup cp ./test4 test4-backup sleep 1 ... cp ./test9 test9-backup cp ./test10 test10-backup
有沒有辦法通過 bash 腳本來實現這一點?我想參數化 1 次迭代(呼叫 sleep 1)執行的命令數量。另一個問題是真實的文件列表有數十萬行。
我假設您不是在描述您的真實場景:您不僅要複製數十萬個文件,而且還想休眠數十萬秒… wtf?!?
反正:
while IFS= read -r file1 IFS= read -r file2 do cp "$file1" "${file1##*/}-backup" cp "$file2" "${file2##*/}-backup" sleep 1 done < inputFile
抱歉:我沒有註意到帶有“數十萬行”的“txt文件”。這只是一個天真的解決方案……
for a in test*; do ls -l $a; if [[ $((i++ % 2)) != 0 ]]; then sleep 1; fi; done
更新:解釋和(部分更新為帶有文件名的 txt 文件)。
…重新格式化:
for a in `cat file.txt` do cp "$a" "$a-backup" ## REPLACE THIS LINE if [[ $((i++ % 2)) != 0 ]] then sleep 1 fi done
- 這個單行意味著;
for a in files
處理文件 $a 如果它是偶數行則休眠。為了看看這條線是否是偶數,我們計算它 (
i++
) 並查看是否i % 2 is 0
- 在 bash 中
$(( ...exp ))
計算...exp
為數值表達式- 這種方式
$((i++ % 2)) != 0
對於偶數迭代是正確的(在這種情況下,我們sleep 1
)- 在 bash 中
[[ ...exp ]]
計算...exp
為布爾表達式注意:此解決方案適用於
file.txt
包含 100_000 個文件,但對於非常大的文件會失敗file.txt