アーカイブから不足しているファイルを見つける方法


0

友人が古いデータ(約200GB)をアーカイブするのを手伝う必要があります。彼が持っている新しいアーカイブには多くのファイルがすでに存在していることがわかりますが、新しいアーカイブはディレクトリ内で適切に編成されています。だから私は単に使用することはできませんrsync

私の質問は、新しいアーカイブに存在しないファイルのみのリストを簡単に取得する方法です。

例えば:

$ files_not_present old_dir new_dir
file1
file2
...

それを行うための独自のスクリプトを書く以外に、私に思い付く唯一のアイデアは、fslintのような重複チェッカーを使用して、アーカイブしたくないファイルのリストを生成し、rsyncで--excludeを使用することです。thegeekstuff.com/2011/01/rsync-exclude-files-and-folders
フランクトーマス14

同じ名前/パスのファイルがありますが、異なるファイルはありますか?それともファイル名だけで行くのですか?
Xen2050 14

同じ名前のファイルは同じであると仮定しています。この場合、異なる可能性はほとんどありません。または、それらが古い場合、それらは古く、必要ありません。比較を行うためのスクリプトを完成させたところです。今、私が実際にどれだけ見つけたかを見に行きます。
アコスタディノフ14

回答:


0

古いアーカイブフォルダーがold_folderで、新しいアーカイブがnew_folderであるとしましょう

次の行を使用して、2つのフォルダーを比較し、new_folderで使用できないold_folderのファイルをリストできます。

for %%i in ("old_folder\*") do if not exist "new_folder\%%~nxi" echo(%%~i)>file.csv

お役に立てれば!


Windows cmdコマンドのように見えます。私が置かれているlinux質問にタグを。答えてくれてありがとう、でも助けにはならない。
akostadinov

oops ... linuxタグが見つからないことをお...びします...これは将来Windowsユーザーの参考になることを願っています。
vembutech 14

0

私が理解しているように、ファイルは同じ名前を持っていますが、それらは異なるサブフォルダーに存在することができます。スクリプトから始めて、ニーズに合わせて開発できます。

#!/bin/sh
[ -d "$1" -a -d "$2" ] || exit
old_dir="$1"
new_dir="$2"
find "$old_dir/" -type f -exec basename {} \; | sort > oldlist.txt
find "$old_dir/" -type f -exec basename {} \; | sort > newlist.txt
diff oldlist.txt newlist.txt | grep '<'

このスクリプトを実行します:

./script.sh old_dir new_dir

これは、すべてのファイル名(フォルダー名をでストリップbasename)を検索し、リストをソートしてで比較するという考え方ですdiff。ファイルリストは、のままになりますoldlist.txtし、newlist.txtファイル。


これは、同じファイルのPATHが異なる場合には適用されません。diff -r気にしなければ、ユーザーを確保できます。
akostadinov 14

@akostadinov、パスは両方のリストから削除されます(両方のリストに/シンボルが生成されるべきではありません)ので、配置されるサブフォルダーファイルに違いはありません。それとも別の意味ですか?
kestasx

私はそれに気づかなかった。しかし、名前だけをコピーする必要があるパスになりません。これは何かです。それでも、私はルビーで必要なことを行うためのスクリプトを作成しています。
akostadinov 14

0

以下のこのいハックを見ないでください。もう一度これを行う必要がある場合は、要点をより便利に更新します:https : //gist.github.com/akostadinov/4cda59f17c450f64bbd6

以下の無駄なもの:

わかりました、誰かがそれを必要とする場合、私はこのアプローチを使用しました:

  1. 新しいアーカイブと古いアーカイブのファイルのリストを取得します。

    $ find new_dir -type f > arch.txt
    $ find old_dir -type f > arch_old.txt
    

    ところでfind -name ".?*" -prune -o -type f、隠しファイルを避けるために使用できます

  2. このrubyスクリプトを使用して、新しいアーカイブナットではなく古いアーカイブナットに存在するファイルのリストを取得します。

    org_arch = "arch.txt"
    to_arch = "arch_old.txt"
    
    # populate Hash with files under question to archive
    arch={}
    File.open(to_arch, "r") do |infile|
      while (line = infile.gets)
        arch[File.basename(line)] = line
      end
    end
    
    # remove from Hash what has already been archived
    File.open(org_arch, "r") do |infile|
      while (path = infile.gets)
        arch.delete(File.basename(path))
      end
    end
    
    #print files to be archived
    arch.each { |name,path|
      puts path
    }
    
  3. コピーする必要があるファイルのサイズを確認します。

    cat to_arch.txt | xargs -d "\n" stat -c "%s" | awk '{size+=$1} END {print size}'
    

私の場合、200GBから約80GBになりました。これが誰かの助けになることを願っています。

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