![[identity profile]](https://www.dreamwidth.org/img/silk/identity/openid.png)
![[community profile]](https://www.dreamwidth.org/img/silk/identity/community.png)
Есть задачка регулярного копирования массива мелких файлов с такими условиями:
1. Если копируемый файл совпадает по размеру/содержанию с существующим -- пропустить или перезаписать.
2. Если копируемый файл отличается по размеру -- копировать, автоматически переименовывая (добавляя к имени что-то вроде _001, _002 и т.д.).
3. Если существующий файл пустой (имеет нулевой размер) -- переписать в любом случае.
Под Windows.
Я полагал, что старый добрый Total Commander с такой задачкой справится, но там либо автоматом все подряд переименовывать, либо заменять файлы большего/меньшего размера. Среди утилиток смотрел Tera Copy -- тоже такого не умеет. Может быть, кто-то сможет подсказать подходящую?
Необязательное пожелание -- при проверке существующего файла выбирать, анализировать ли только размер (для скорости), либо размер и содержимое (для надежности). Но это необязательно.
1. Если копируемый файл совпадает по размеру/содержанию с существующим -- пропустить или перезаписать.
2. Если копируемый файл отличается по размеру -- копировать, автоматически переименовывая (добавляя к имени что-то вроде _001, _002 и т.д.).
3. Если существующий файл пустой (имеет нулевой размер) -- переписать в любом случае.
Под Windows.
Я полагал, что старый добрый Total Commander с такой задачкой справится, но там либо автоматом все подряд переименовывать, либо заменять файлы большего/меньшего размера. Среди утилиток смотрел Tera Copy -- тоже такого не умеет. Может быть, кто-то сможет подсказать подходящую?
Необязательное пожелание -- при проверке существующего файла выбирать, анализировать ли только размер (для скорости), либо размер и содержимое (для надежности). Но это необязательно.
no subject
Date: 2017-01-30 09:50 am (UTC)no subject
Date: 2017-01-30 10:39 am (UTC)no subject
Date: 2017-01-30 10:02 am (UTC)В принципе на PowerShell то же самое делается, но не так красиво.
Проще всего сделать так:
1) Удаляем все файлы нулевого размера в целевой папке.
2) Берем список уже существующих файлов и копируем соответствующие им, если они есть, в новое имя.
3) Копируем все файлы, которых еще нет.
Так проще, чем на каждый файл отдельно выяснять, надо ли переименовывать. Еще проще, но медленнее: сначала удалить все совпадающие файлы, потом скопировать вообще все.
no subject
Date: 2017-01-30 10:49 am (UTC)http://unxutils.sourceforge.net/
Там ничего подходящего под мои цели не найдется?
Со сравнением каталогов и поисков дубликатов не хотелось бы связываться -- во-первых, большой риск накосячить при каком-нибудь несовпадении имен вложенных каталогов, во-вторых, не встречал, честно говоря, хороших решений по автоматическому удалению дубликатов.
no subject
Date: 2017-01-30 10:57 am (UTC)Без пункта о переименовании файлов все делалось бы одной командой rsync. Переименование усложняет, это будет find + xargs или for, но в любом случае из стандартных команд. Так или иначе это не готовое решение, а полуфабрикат, но он того стоит: даже задача "разложи 1000 mp3-файлов по папкам в соответствии с написанными в них! тегами" решается этими инструментами ненамного сложнее.
no subject
Date: 2017-01-30 11:17 am (UTC)no subject
Date: 2017-01-30 03:03 pm (UTC)$ find . -type f | xargs sha256sum | sort | awk '{print $2, $1}' | uniq -f 1 > unique-files.txt
создает файл со списком уникальных файлов. Команда awk тут нужна, чтобы переставить местами колонки в списке, остальное ясно.
no subject
Date: 2017-01-30 03:23 pm (UTC)no subject
Date: 2017-01-30 11:01 am (UTC)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 - это два разных файла, могущих лежать в одной папке рядом!
no subject
Date: 2017-01-30 11:11 am (UTC)no subject
Date: 2017-01-30 10:27 am (UTC)no subject
Date: 2017-01-30 10:50 am (UTC)http://unxutils.sourceforge.net/
Не подскажете, среди них ничего подходящего нет?
no subject
Date: 2017-01-30 12:19 pm (UTC)no subject
Date: 2017-01-30 02:00 pm (UTC)no subject
Date: 2017-01-30 01:43 pm (UTC)Причём, она могла проводить операции сравнения и синхронизации в каталогах, содержащих множество вложенных папок с сохранением их структуры.
no subject
Date: 2017-01-30 02:03 pm (UTC)