[identity profile] mef-is-toffel.livejournal.com posting in [community profile] useful_faq
Есть задачка регулярного копирования массива мелких файлов с такими условиями:

1. Если копируемый файл совпадает по размеру/содержанию с существующим -- пропустить или перезаписать.
2. Если копируемый файл отличается по размеру -- копировать, автоматически переименовывая (добавляя к имени что-то вроде _001, _002 и т.д.).
3. Если существующий файл пустой (имеет нулевой размер) -- переписать в любом случае.

Под Windows.

Я полагал, что старый добрый Total Commander с такой задачкой справится, но там либо автоматом все подряд переименовывать, либо заменять файлы большего/меньшего размера. Среди утилиток смотрел Tera Copy -- тоже такого не умеет. Может быть, кто-то сможет подсказать подходящую?

Необязательное пожелание -- при проверке существующего файла выбирать, анализировать ли только размер (для скорости), либо размер и содержимое (для надежности). Но это необязательно.

Date: 2017-01-30 09:50 am (UTC)
From: [identity profile] denimih.livejournal.com
Проще в Дельфях написать за 5 минут.

Date: 2017-01-30 10:02 am (UTC)
From: [identity profile] agalakhov.livejournal.com
В UNIX это пара команд на шелле. Если такие задачи возникают регулярно, советую установить msys и делать такие вещи через него. На работе мы именно так и делаем. Искать под каждую такую мелочь отдельную программулину - сдохнуть можно, проще поставить bash на Windows.

В принципе на PowerShell то же самое делается, но не так красиво.

Проще всего сделать так:
1) Удаляем все файлы нулевого размера в целевой папке.
2) Берем список уже существующих файлов и копируем соответствующие им, если они есть, в новое имя.
3) Копируем все файлы, которых еще нет.

Так проще, чем на каждый файл отдельно выяснять, надо ли переименовывать. Еще проще, но медленнее: сначала удалить все совпадающие файлы, потом скопировать вообще все.
Edited Date: 2017-01-30 10:06 am (UTC)

Date: 2017-01-30 10:57 am (UTC)
From: [identity profile] agalakhov.livejournal.com
Есть порт юникс-команд под винду под названием msys. Подходящая команда, она же главная - bash, делает почти все. Ну еще rsync можно. И еще tar: классический прием - заархивировать и сразу разархивировать обратно (архив на диске как файл не создается, идет через пайп) очень удобен для копирования файлов, в том числе по сети.

Без пункта о переименовании файлов все делалось бы одной командой rsync. Переименование усложняет, это будет find + xargs или for, но в любом случае из стандартных команд. Так или иначе это не готовое решение, а полуфабрикат, но он того стоит: даже задача "разложи 1000 mp3-файлов по папкам в соответствии с написанными в них! тегами" решается этими инструментами ненамного сложнее.

Date: 2017-01-30 03:03 pm (UTC)
From: [identity profile] agalakhov.livejournal.com
Легко делается. Там есть команда вычисления хэш-суммы файла, например sha256sum или md5sum. Дальше просто: запускаем ее на все файлы, результат сортируем командой sort и прореживаем uniq -f. Получается список всех уникальных файлов (т.е. каждое содержимое встречается ровно один раз). Потом достаточно удалить файлы, которых нет в списке.

$ find . -type f | xargs sha256sum | sort | awk '{print $2, $1}' | uniq -f 1 > unique-files.txt

создает файл со списком уникальных файлов. Команда awk тут нужна, чтобы переставить местами колонки в списке, остальное ясно.
Edited Date: 2017-01-30 03:08 pm (UTC)

Date: 2017-01-30 11:01 am (UTC)
From: [identity profile] agalakhov.livejournal.com
Вот он:
http://www.mingw.org/wiki/msys
Качаете mingw-get, он все ставит. Получаете в Windows почти настоящую UNIX-консоль, 99% команд линукса будут работать. И дальше что угодно можно делать.

Что надо знать: в именах файлов UNIX слеш пишется в другую сторону, а дисков вроде c: нету. MSYS имитирует диски Windows с помощью папок, поэтому путь C:\Users\MyName превращается в /c/Users/MyName. Обратите внимание, в UNIX имена файлов чувствительны к регистру, readme.txt и Readme.txt - это два разных файла, могущих лежать в одной папке рядом!

Date: 2017-01-30 10:27 am (UTC)
From: [identity profile] starmaugli.livejournal.com
Мне тоже кажется, что лучшей бесплатной утилитой в данном случае окажется любой Линукс. Ну, правда, под Виндовс придется еще виртуальную машину городить. Хотя если мощности позволяют, то не такая это уж и проблема.

Date: 2017-01-30 12:19 pm (UTC)
From: [identity profile] starmaugli.livejournal.com
по присланной вами ссылки shellutils вероятно (sh.exe).

Date: 2017-01-30 01:43 pm (UTC)
From: [identity profile] alfare.livejournal.com
Когда-то нечто похожее я делал многофункциональной утилитой, входившей в ТС Beyond Compare. Но гарантировать не могу, если есть жедание - почитайте про эту штуку, очень полезная для всяческой синхронизации и сравнения каталогов по множеству условий.
Причём, она могла проводить операции сравнения и синхронизации в каталогах, содержащих множество вложенных папок с сохранением их структуры.
Edited Date: 2017-01-30 01:45 pm (UTC)