Bash

bash 一次執行 X 個參數的命令

  • April 13, 2015

我有一個儲存在 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

引用自:https://unix.stackexchange.com/questions/195983