Мне нужно помочь другу заархивировать его старые данные (около 200 ГБ). Я вижу, что многие файлы уже присутствуют в его более новом архиве, но более новые архивы должным образом организованы в каталогах. Так что я не могу просто использовать rsync .

У меня вопрос, как легко получить список только тех файлов, которых нет в новом архиве.

Например:

$ files_not_present old_dir new_dir
file1
file2
...

3 ответа3

0

скажем, ваша старая папка архива old_folder, а новый архив как new_folder

Вы можете использовать следующую строку, чтобы сравнить две папки и перечислить файлы в old_folder, который недоступен в new_folder

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

Надеюсь это поможет!

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 .

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}'
    

В моем случае я пошел от 200 ГБ до около 80. Надеюсь, это кому-нибудь поможет.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .