mv
を使用して大きなディレクトリを移動する場合、進行状況(%)を表示する方法はありますか? gentooのcp
コマンドには-g
進行状況を示すスイッチ。
パッチを当てたcpとmvをビルドして、両方とも-gスイッチをサポートして進行状況を表示できます。手順とパッチは このページ にあります。 ただし:このページでは、
$ Sudo cp src/cp /usr/bin/cp
$ Sudo cp src/mv /usr/bin/mv
元のcpとmvを上書きします。これには2つの欠点があります。1つ目は、更新された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
および直接進行状況バーを取得します。
より簡単な解決策がある場合に、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% [===============================> ]
バー:
「バー」-「猫」ASCIIプログレスバー
bar
は、あらゆる種類の操作(cp、tarなど)のプロセスバーを表示する小さなシェルスクリプトです。 プロジェクトのホームページで例を見つけることができます。
それはボーンシェルのためにも書かれているので、どこでも近くで走ります。
実行中のコマンドに関連する記述子を見つけ、進行状況と速度を表示できるprogress
という新しいツールがあります: ここで利用可能
progress -w
実行中のすべてのcp、mvなどの操作の統計を出力します
パイプビューア コマンドpv
を使用して、進行状況バーを表示できます。
pv /original/file > /new/file
私はよくこれを使用して、マウントされたネットワークファイルシステムを介して大きなファイルをコピーします(gzip
およびtar
と組み合わせます)。欠点は、oneファイルのみをコピーでき、ディレクトリはコピーできないことです。また、新しいファイルに名前を付ける必要があります。cp
のように宛先ディレクトリを指定することはできません。ただし、コピーはpv
の目的ではありません。これは強力なツールであり、ファイルをコピーするだけではありません。 pv
のその他の例については、ホームページを参照してください。
より良いオプションはrsync -aP
を使用することです。代わりにmv
を使用する場合は、フラグ--remove-source-files
を追加します。コマンドを頻繁に使用する場合は、これを.bashrc
に追加します。
alias rscp='rsync -aP'
alias rsmv='rsync -aP --remove-source-files'
ここでの欠点は、rsyncが進行状況を表示するだけで、進行状況バーを表示しないことです。
目的が進行状況バーでディレクトリを移動/コピーすることであるが、非端末GUIを回避することである場合は、mc(Midnight Commander)が適切な選択です。
私の解決策はrsync
を使用することです。他の多くの機能(特に、部分的にコピーされたディレクトリの同期とネットワーク上での作業)の中でも特に、ディレクトリのコピー、コピーの成功(ソースの「移動」)後のソースファイルの削除、進捗レポートの表示が可能です。
これが進行状況レポートを含むrsyncでディレクトリを移動する方法です。
rsync -aP --remove-source-files $src $dst && rm -r $src
$src
がnotをバックスラッシュで終了していることを確認してください。末尾がバックスラッシュでない場合、=とは異なる意味になります。 GNU cp
。
最後にrm -r
が必要なのは、--remove-source-files
が削除されるのは、ディレクトリではなく、各ファイルが正常にコピーされた後であるためです。 &&
は、rsyncが正常に完了した場合にのみ実行されるようにします。偏執狂の場合は、find $src -d -exec rmdir {} +
などの再帰的なrmdir
に置き換えることができます。
唯一の問題は、-P
オプションが、コピー操作全体ではなく、各ファイルの進行状況を表示することです。小さなファイルが多数あるディレクトリを移動しようとしている場合、これは役に立たない場合があります。 rsyncの最新の開発バージョンには、操作全体の進行状況を示す代替フラグ--info=progress2
があります。
まず、コンピュータを30分以上使用したくないことがわかっている場合を除き、ioniceを使用せずに大きなファイルをコピーすることはありません。
次に、すべてのパーティションがジャーナリングされるため、パーティション内のコピーに時間がかかりません。長いコピーの場合はdu -sm
ファイルとdf -m | grep copy_to_partition
。次に、さらに時間がかかると気になる場合は、もう一度df
を実行して、コピーされたファイルの量を確認します。
これは進行状況バーを表示しませんが、CTRL-T
とSIGINFO
を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%
私のミントでは、これまたはカールソリューション(本当に素晴らしい)でgcpを使用するのが好きです
gcp SOURCE DESTINATION
インストールする必要があるかもしれませんSudo apt-get install gcp
そして、プログレスバーのためのとても素敵で素晴らしいタスク
可読形式のニースは次のとおりです。
curl -o DESTINATION FILE://source
また、最初にインストールする必要があるかもしれませんSudo apt-get install curl
mv
とcp
に進行状況バーを追加するためのcoreutilパッチ適用を回避するために、gcp
(GoffiのCoPier)は新しい代替手段です http://wiki.goffi。 org/wiki/Gcp/en
cp
と同じように使用して、再帰性にはオプション-r
、冗長性には-v
を使用します。
複数のコマンドが同時に呼び出された場合、ファイルキューを使用します。また、コピーしたファイル名をログに記録することもできます。詳細については、ソースの保存のマニュアルページのセクションを参照してください。
gcp
を使い始めるのに適したチュートリアルは次のとおりです。 http://mylinuxbook.com/gcp-advanced-command-line-file-copier-inspired-by-cp/
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による進行情報
いつも私はこの答えを探してしまうafter 'mv'コマンドを開始します。その時点で、それを再び開始したくありません。この状況にある場合、進行状況を監視する(または、それが十分な距離にあり、殺す価値がないかどうかを確認する)非常に簡単な方法は、次のように実行することです。
du -hs /directory/you're/moving/data/to
これはディレクトリのサイズを出力するだけなので、コピーされたデータの量を確認したり、数回実行してデータの転送速度を確認したりできます。
rsmv
という名前で保存された次のスクリプトを使用します。
#!/usr/bin/env bash
rsync -aP --remove-source-files "$@" && rm -rf "${@:1:$#-1}"
空白を含む複数のソースとファイル名を処理します。
$ rsmv source1 source2 source\ 3 "source 4" dest