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
私はあなたが実際のシナリオを説明していないと仮定します。何十万ものファイルをコピーしたいだけでなく、何十万秒も眠りたいと思うかもしれません...何? ! ?
それでも:
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