指定されたファイルサイズの範囲内でファイルとディレクトリツリーをコピーします。

指定されたファイルサイズの範囲内でファイルとディレクトリツリーをコピーします。

/pp/01 /pp/02/異なるディレクトリの例などのファイルを同じディレクトリデザインを使用して別のターゲットにコピーする小さなスクリプトを作成したいと思います。ただし、88 MB より大きく 93 MB より小さいディレクトリのファイルにのみ適用されます。

forループとfind関数を使いましょう。より効率的な方法がありますか?そして、検索機能を正確に実装する方法。

答え1

このコマンドは次のとおりです。

rsync -a --min-size 88m --max-size 93m pp /new_destination/

構造をからにコピーしますが、ppサイズ/new_destinationが少なくとも88 MBから最大93 MBのファイルのみをコピーします。

必要に応じて、最終的なターゲット指定子の前にさらにソースツリーを追加できます。たとえば、次のようになります。

rsync -a --min-size 88m --max-size 93m pp/01 pp/02 /target/

ソース仕様に末尾のスラッシュ(pp/代わりに)を追加すると、ターゲットpprsyncディレクトリは作成されません。

つまり、pp最初の例では結果はです/new_destination/pp/01/...。一方:

rsync -a --min-size 88m --max-size 93m pp/ /new_destination/

代わりに結果は/new_destination/01/...、です/new_destination/02/...

-atoフラグはrsync「アーカイブ」を意味します。これはディレクトリで繰り返され、権限やタイムスタンプなどのファイルのメタデータを保存します。 (これは-rlptgoD非常に人気のあるオプションの組み合わせに対応する便利なオプションです。)

答え2

私はこれがあなたが探しているものだと思います:

$ find /file/location/ -type f -size +88M -size -93M \
    -exec cp {} /new/location/ \;`

このコマンドは、88 MB より大きく 93 MB 未満のファイルのみを検索します。次に、各ファイルを/new/location

ディレクトリ構造を維持することはもう少し難しくなります。私は次のように問題を解決します:

$ cd /pp
$ find . -type f -size +88M -size -93M -exec cp \
    --parents {} /new/location/pp \;

findこれにより、返されたファイルパスが次のように表示されます01/myfile02/myfile親フラグをオンにすると、cpスラッシュ+ソースファイルの指定された名前が追加されます。

例:find一致するファイルを見つけて「02 / myfile」を出力します。cpこのファイル/new/location/pp/02/myfileを作成したいディレクトリに移動します。

答え3

ファイル名とディレクトリ名に改行文字が含まれていないと仮定すると、POSIXlyは次のようになります。

cd /path/to/src/ &&
  find . -type f -size -"$((93 * 1024 * 1024))c" \
                 -size +"$((88 * 1024 * 1024))c" |
    pax -rw /path/to/dst/

答え4

「最小」から「最大」サイズの範囲のファイルをコピーしてディレクトリ構造を再生成するには、次の方法を使用します。

MINSIZE=3k  
MAXSIZE=10k  
cd /source/dir && \
   find . -type f -size "+$MINSIZE" -size "-$MAXSIZE" | cpio -pvdm /target/path

cpioオプション

  • -p「パス」モードは、リストされている各ファイルを指定されたディレクトリにコピーします。
  • -v「Verbose」は省略でき、進行状況の視覚的な手がかりを得るために各ファイルにドットを表示するために-V代わりに使用します。
  • -d「必要に応じてディレクトリを作成する」
  • -m 「保存モード」(権限、所有権)

関連情報