it-swarm-ja.com

一定のスペースが残るまでハードドライブをいっぱいにしますか?

AppleおよびAndroidデバイスで製品のテストを行っています。100KBのスペースまでデバイスのハードドライブをいっぱいにするスクリプトが必要ですが実行されるドライブに残されます。Linuxシステムでも、dd if =/dev/zero of = zeros bs = 1Mを使用してhddを完全に埋めますが、..特定のまでhddを埋めるにはどうすればよいですか残りのスペースは?linuxコマンドラインとbatスクリプト(windows)の両方でこれが欲しいです。Shellスクリプトとwindowsバッチスクリプトの例が最適です!ありがとう!

1
Rubynator

実際のファイルを作成する必要がありますか、それともダミーファイルで十分ですか?使用しているddメソッドは、大きなドライブではかなり遅くなります。 。 。

Windowsでは、fsutil file createnew <filename> <length_in_bytes>を使用してフィラーファイルを作成できます。これが 詳細が記載されたtechnetページ です。

Linuxでは、fallocateは同様に機能します。 fallocate -l 10G 10gig_filler。これが 前のSUの質問 フィラーファイルの作成と Stack Overflowのもう少し技術的なバージョン です。

4
ernie

Linuxでは、次のようにして1M *だけを残すことができます。

avail=$( df --output=source,avail -BM | grep sda6 | 
        awk '{print $NF}' | sed s/M//i); size=$((avail-left)  ); 
fallocate -l $sizeM filler_file;

秘訣は、dfを解析して使用可能なスペースを取得し、fallocateを使用して必要なサイズのファイルを作成することです。ただし、@ jjlin 指摘 のように、fallocate呼び出しはすべてのファイルシステムで機能するとは限りません。

上記の小さなスクリプトを関数に変換して使いやすくしたり、fallocate(をサポートしていないファイルシステム上でファイルを作成するために 代替メソッド を使用したりすることもできます。ただし、fallocatemuch高速であり、可能な場合は優先する必要があります)。これらの行を~/.bashrc(または他のシェルと同等のもの)に追加するだけです。

fill_disk(){
    ## The space you want left
    left=$1 
    ## The unit you are using (Units are K, M, G,  T,  P, E, Z, Y (powers of 1024) or 
    ## KB, MB, ... (powers of 1000).
    unit=$2 
    ## The target drive
    disk=$3 
    ## The file name to create, make sure it is on the right drive.
    outfile=$4
    ## The space currently available on the target drive
    avail=$(df --output=source,avail -B$unit | grep $disk | awk '{print $NF}' | sed s/$unit//i); 
    ## The size of the file to be created
    size=$((avail-left))
    ## Skip if the available free space is already less than what requested
    if [ "$size" -gt 0 ]; then
    ## Use fallocate if possible, fall back to head otherwise
    fallocate -l $size$unit $outfile 2>/dev/null || head -c $size$unit /dev/zero > $outfile
    else 
    echo "There is already less then $left space available on $disk"
    fi
}

次に、次のように起動できます。

fill_diskdesired_free_spaceユニットtarget_diskout_file

たとえば、/foo.txt/)で1億だけ空きを残すsda1というファイルを作成するには、次のコマンドを実行します。

fill_disk 100 M sda1 /foo.txt

ただターゲットファイルが埋めたいドライブ上にあることを確認してください、関数はそれをチェックしません。

*小さいサイズでは確実に動作させることができませんでした。スペースが不足するか、要求した値とわずかに異なる値が表示されます。


要求に応じて、これはスクリプトと同じものです。

#!/bin/env/bash
left=$1 
unit=$2 
disk=$3 
outfile=$4
avail=$(df --output=source,avail -B$unit | grep $disk | awk '{print $NF}' | sed s/$unit//i); 
size=$((avail-left))
if [ "$size" -gt 0 ]; then
  fallocate -l $size$unit $outfile 2>/dev/null || head -c $size$unit /dev/zero > $outfile
else 
  echo "There is already less then $left space available on $disk"
fi

fill_disk.shとして保存し、次のように実行します。

bash fill_disk.sh 100 M sda1 /foo.txt
0
terdon