ファイルを移動して進行状況を表示するには(たとえば、進行状況バーを使用)。


118

を使用して大きなディレクトリを移動する場合mv、進行状況(%)を表示する方法はありますか?cpgentoo のコマンドに-gは、進行状況を示すスイッチがありました。


3
ファイルを移動するときにこれらのツールを簡単に使用できるかどうかはわかりませんが、シェルでパイプスループットを測定すると役立つ場合があります
Michael Mrozek

回答:


50

パッチを適用したcpとmvを構築し、両方が-gスイッチをサポートして進行状況を表示できるようにします。このページには手順とパッチがありますただし、ページに指示があります

$ sudo cp src/cp /usr/bin/cp
$ sudo cp src/mv /usr/bin/mv

これにより、元のcpおよびmvが上書きされます。これには2つの欠点があります。まず、更新されたcoreutilsパッケージがシステムに到着すると、それらは上書きされます。第二に、パッチを当てたバージョンに問題がある場合、標準のcpおよびmvに依存するスクリプトが破損する可能性があります。私はむしろこのようなことをしたい:

$ sudo cp src/cp /usr/local/bin/cpg
$ sudo cp src/mv /usr/local/bin/mvg

これは、ユーザーがコンパイルしたプログラム用の/ usr / local / binにファイルをコピーし、別の名前を付けます。したがって、プログレスバーが必要な場合はmvg -g bigfile /mnt/backup、mvを通常どおり使用します。

また、あなたはalias mvg="/usr/local/mvg -g"それを行うことができ、あなたは言うだけmvg bigfile /mnt/backupで直接プログレスバーを取得します。


2
残念ながら、「このページ」のパッチはもう存在せず、Webアーカイブで索引付けされていないようです。同様の名前と機能を持つ多くのパッチがあるように見えますが、答えを編集して、あなたが意図したものを明確にできますか?
ジル

github.com/atdt/advcpmvは有効な後継バージョンであり、同じパッチを持っていると思うので、それを指すようにリンクを変更しました。
fschmitt

93

より簡単な解決策がある場合にcoreutilからバイナリを上書きするという考えは好きではないので、ここに私のものがあります。

rsync:Rsyncはファイルをコピー-Pし、進行状況バーのスイッチがあります。したがって、rsyncをインストールしている場合、シェルのドットファイルで単純なエイリアスを使用できます。

alias cp='rsync -aP'

欠点は、rsyncがcpよりも少し遅いことですが、これを時間で測定し、自分で判断する必要があります。

シェルスクリプトシェルスクリプトはプログレスバーも作成できます。私はしばらく前にネットでこれを見つけましたが、ソースを覚えていません:

#!/bin/sh
cp_p()
{
   strace -q -ewrite cp -- "${1}" "${2}" 2>&1 \
      | awk '{
        count += $NF
            if (count % 10 == 0) {
               percent = count / total_size * 100
               printf "%3d%% [", percent
               for (i=0;i<=percent;i++)
                  printf "="
               printf ">"
               for (i=percent;i<100;i++)
                  printf " "
               printf "]\r"
            }
         }
         END { print "" }' total_size=$(stat -c '%s' "${1}") count=0
}

これは次のようになります。

% cp_p /home/echox/foo.dat /home/echox/bar.dat
66% [===============================>                      ]

バー

'bar'-ASCIIプログレスバー付きの 'cat'

barは、あらゆる種類の操作(cp、tarなど)のプロセスバーを表示する小さなシェルスクリプトです。プロジェクトのホームページで例を見つけることができます

また、ボーンシェル用に作成されているため、どこでも近くで実行されます。


3
barmvまだラップしていません。
東武


1
特にOPのようなコピーオンライトファイルシステムでの高速コピーに関しては、OPが完全にrsync置き換えないことに注意してください。mvbtrfs
カールリヒター

74

progress実行中のコマンドに関連する任意の記述子を検索し、進行状況と速度を表示できる 新しいツールがあります。こちらから入手できます

progress -w

実行中のすべてのcp、mvなどの操作の統計を出力します


3
うわー、これがこんなにすごいとは思っていませんでした!progressインストール後に入力するだけで、mv現在待機していたコマンドの進行状況が表示されました。ありがとう!
jredd

3
ありがとう!ものをルートとして移動するときは、使用する必要があるようですsudo(同じユーザーだと思います)watch-2秒ごとに何が起こっているかを言うのにも使用できますwatch progress -w
。– Wilf

6
素晴らしいプログラムですが、たとえば多くのファイルがあるフォルダーを移動する場合、フォルダー全体ではなく、現在のファイルの進行状況のみが表示されます。代わりにwatch progress -w単に使用することもできますprogress -m
-mxmlnkn

6
私見、これは問題を解決するための最もUNIXの方法です。coreutilsにパッチを適用したり、特定の目的(mvのrsyncなど)に指定されていないツールを使用したり、過剰なスクリプトを作成したりする代わりに、対象となる目的のために作成されたツールを使用してください。
悲嘆

34

パイプビューアーコマンドpvを使用して、進行状況バーを表示できます。

pv /original/file > /new/file

私は頻繁に(と組み合わせる搭載したネットワークファイルシステム上の大きなファイルをコピーするためにこれを使用gzipしてtar)。欠点は、ディレクトリではなく1つのファイルしかコピーできないことです。そして、あなたは新しいファイルに名前を付けなければなりません、あなたがするように単に目的のディレクトリを与えることはできませんcp。ただし、コピーはpv目的ではありません。これは強力なツールであり、ファイルをコピーするだけではありません。のその他の例については、ホームページをご覧くださいpv

より良いオプションはを使用することrsync -aPです。mv代わりに、フラグを追加する場合--remove-source-files.bashrcコマンドを頻繁に使用する場合は、これを追加します。

alias rscp='rsync -aP'
alias rsmv='rsync -aP --remove-source-files'

ここでの欠点は、rsyncは進行状況のみを表示し、進行状況バーを表示しないことです。


tar cf - source-dir | pv | tar xf - -C out-dirディレクトリ全体のスループットが得られます。サイズがわかってい-sてpvに渡すと、進捗状況もわかります。
-arantius

6

進行状況バーを使用してディレクトリを移動/コピーするが、非ターミナルGUIを避けたい場合は、mc(Midnight Commander)が適しています。


3

私の解決策はを使用することrsyncです。ディレクトリをコピーし、コピーが成功した後にソースファイルを削除し(「移動」)、他の多くの機能の中でも進行状況レポートを表示できます(特に、部分的にコピーされたディレクトリの同期とネットワーク経由の作業)。

進行状況レポートを使用して、rsyncを使用してディレクトリを移動する方法を次に示します。

rsync -aP --remove-source-files $src $dst && rm -r $src

バックスラッシュで終わらないように$srcしてください。そうしないと、GNUとは異なる意味になりますcp

rm -rので、最後には必要とされている--remove-source-files各1が正常に、ディレクトリをいないコピーされた後だけに、ソースファイルを削除します。これ&&により、rsyncが正常に完了した場合にのみ実行されます。あなたが被害妄想している場合は、再帰的なのいくつかの種類に置き換えることができますrmdirなど、find $src -d -exec rmdir {} +

唯一の問題-Pは、コピー操作全体ではなく、オプションが各ファイルの進行状況を表示することです。多くの小さなファイルがあるディレクトリを移動しようとしている場合、これは役に立たないかもしれません。rsyncの最新の開発バージョンには、--info=progress2操作全体の進行状況を示す代替フラグがあります。


2

プログレスバーを追加するパッチ適用coreutil避けるためmvcpgcp(Goffiのコピー機)が、新たな代替手段です。http://wiki.goffi.org/wiki/Gcp/en

再帰性および冗長性のcpオプションと同じ方法を使用します。-r-v

複数のコマンドが同時に呼び出されると、ファイルキューを使用します。また、コピーしたファイル名をログに記録することもできます。詳細については、ソース保存のマニュアルページセクションを参照してください。

ここから始めるのに良いチュートリアルがありますgcphttp : //mylinuxbook.com/gcp-advanced-command-line-file-copier-inspired-by-cp/


cpにgcpのようなgmvはありますか?
CodyChan

同等のものは見つかりませんでした。ところで、単一のファイルシステムで「mv」を実行する場合、進行状況バーは必要ありません...それは非常に高速です。2つの異なるファイルシステム間で移動が行われる場合、cpとして実装され、成功した場合はソースを削除し、失敗した場合はターゲットを削除します。gcpに基づく単純なシェルスクリプトで適切に実行できます(ソースとターゲットが実際に異なるファイルシステムにあるかどうかを確認するための最初のチェックで)
Yves Martin

2

まず、コンピュータを30分以上使用したくないことがわかっている場合を除き、ioniceを使用せずに大きなファイルをコピーすることはありません。

2番目:パーティションはすべてジャーナリングされるため、パーティション内のコピーには時間がかかりません。長いコピーの場合はdu -sm、ファイルとを実行しますdf -m | grep copy_to_partition。その後、どれくらい時間がかかるか知りたい場合は、dfもう一度やり直して、コピーされたファイルの量を確認します。


ioniceのヒントを共有しますか?mv cpu-wiseおよびdisk i / o wiseにどのような優先順位を付けますか?ここに私の設定がありますが、CPU負荷はレニッキング後もまだ高いです:imgur.com/a/DLMJplz
ychaouche

2

私のミントでは、これまたはカールソリューションでgcpを使用するのが好きです(本当に素晴らしいです)

gcp SOURCE DESTINATION

あなたはそれをインストールする必要があるかもしれません sudo apt-get install gcp

そして、進行状況バーに関する非常に素晴らしく優れたタスクであり、

  • 合計%
  • 受信率
  • %Xferd
  • 平均DL
  • 高速アップロード
  • 残り時間
  • 使った時間
  • 時間合計
  • 現在の速度

読みやすい形式で:

curl -o DESTINATION FILE://source

また、最初にインストールする必要があるかもしれません sudo apt-get install curl


gcpファイルの移動はサポートしていません。つまり、コピーが成功したらソースファイルを手動で削除する必要があります。
カールリヒター

2

これはプログレスバーを提供しませんが、ヒットするCTRL-TSIGINFOto を送信しmvます。これは、作業中のファイルとプロセスの進行状況を報告します。これは大きなファイルの転送に非常に便利で、多くの小さなファイルの転送にはあまり役に立たない可能性があります。

簡単な例:

mv 135/61 /Volumes/Jules/135/
# hit C-t
load: 1.08  cmd: cp 35470 uninterruptible 0.00u 0.04s
135/61/1/1-s2.0-S006738-main.pdf -> /Volumes/Jules/135/61/1/1-s2.0-S006738-main.pdf  68%

1
これは私にとってはうまくいきませんでした:INFO: unknown signal; killall -l lists signals. SIGINFOは標準POSIXではなく、一部のBSDでしかないと思います。
ブライアンミントン

2
右。Mac OS Xでは動作しますが、Ubuntuなどでは動作しない可能性があります。
チャールズ

1

mv -v移動したファイルごとに1行pv -lを印刷し、行数(実際のファイル数)に基づいて進行状況を印刷するために使用します。

必要になりますpv(パイプビューア):http : //www.ivarch.com/programs/pv.shtml

mv -v sourcedir targetdir | pv -l -s filecount > logfile

次のコマンドを使用して、ファイルカウントを取得します。

find sourcedir | wc -l

このコマンドは、コピーされたファイルの数に基づいて進捗情報を表示します。これは、小さなファイルが多数ある場合に最適です。巨大なファイルが数個しかない場合は、あまり楽しくありません。

mv同じパーティション上では高速であることに注意してください。mv別のパーティションへのがcp source target続くのと同じになりますrm source。そのため、進行状況情報を含むディレクトリをコピーする2つのコマンドがあります。

コピーされたファイルの数に基づいて進行状況を報告するには:

cp -av sourcedir targetdir | pv -l -s filecount > logfile

コピーされたバイトに基づいて進行状況を報告するには:

tar c sourcedir | pv -s size | tar x -C targetdir

詳細についてはこちらをご覧ください:pvによるディレクトリコピーの進捗情報


1

「mv」コマンドを開始した、必ずこの回答を検索することになります。この時点では、再度開始する必要はありません。この状況にある場合、進行状況を監視する非常に簡単な方法(または、殺す価値がないほど十分に進んでいるかどうかを確認する)は、次のコマンドを実行することです。

du -hs /directory/you're/moving/data/to

これにより、ディレクトリのサイズが出力されるため、コピーされたデータ量を確認したり、数回実行してデータの転送速度を確認したりできます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.