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

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

それでも:

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.txt100,000個のファイルを含むファイルでは機能しますが、非常に大きなファイルでは失敗します。file.txt

関連情報