我有一个存储在 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