bash 一次执行 X 个参数的命令

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)。另一个问题是实际的文件列表有数十万行。

答案1

我假设您没有描述您的真实场景:您不仅想要复制数十万个文件,而且还想休眠数十万秒......wtf?!?

反正:

while IFS= read -r file1
      IFS= read -r file2
do
    cp "$file1" "${file1##*/}-backup"
    cp "$file2" "${file2##*/}-backup"
    sleep 1
done < inputFile

答案2

对不起:我没有注意到“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

相关内容