Операції з файлами


Синхронізація

rsync (one-way)

rsync -avh --progress file1 file2

# копіювання з видаленням файлів/каталогів в destination, яких вже немає у source
# ключ -P є еквівалент --partial --progress
rsync -avPh --delete /source/ /destination

# не виконувати копіювання, якщо в destination файл новіший ніж в source
# ключ -u або --update
rsync -avuPh --delete /source/ /destination

# копіювання файлів по SSH (по "нестандартному" порту) з дозавантаженням
rsync -avP --append --progress -e "ssh -p 11111" /source/ user@server.org:/destination

# попередній перегляд змін (актуально при видаленні)
rsync --dry-run -avPh --delete /source/ /destination

# у впадку помилки "rsync IO error encountered -- skipping file deletion"
# або різного розміру каталогів (та кількості файлів) після синхронизації
rsync -avPh --ignore-errors --delete /source/ /destination

Якщо при копіюванні каталогу вказати замикаючий слеш, то сам каталог не буде створено, а перепишеться лише його вміст:

$ tree /source
  source
   ├── file1
   ├── file2
   └── ...

$ rsync -aP /source/ /destination
$ tree /destination
  destination
   ├── file1
   ├── file2
   └── ...

$ rsync -aP /source /destination
$ tree /destination
  destination
   └── source
        ├── file1
        ├── file2
        └── ...

Найбільш часто вживані ключі (повний перелік див. rsync man page):

За для пришвидшення процесу копіювання можна запустити N копій програми:

ls /dir/source | xargs -n1 -P4 -I% rsync -Pa % /destination

xargs читатиме перелік каталогів і запускатиме 4 rsync процесів за раз (символ % замінює вхідний аргумент кожного виклику команди).

Новая версія: rsync

rclone (one-way)

Rclone дозволяє синхронізацію з хмарними сховищами (Microsoft OneDrive, Google Drive та ін.). Конфігурацію з’єднання можна реалізувати як в консолі, так і за допомогою web-інтерфейсу

# interactive configuration
rclone config

# web-based graphical user interface
rclone rcd --rc-web-gui

Приклад синхронізації локальної директорії на OneDrive

# rclone sync 
#     -P                        # показати прогрес під час передачі (скорочення від --progress)
#     --fast-list               # recursive list (uses more memory but fewer transactions)
#     --buffer-size=1G          # розмір буфера при читанні файлів (для кожного з --transfer)
#     --transfers=5             # кількість паралельних передач файлів (за замовчуванням 4)
#     --checkers=40             # кількість перевірок, які запускаються паралельно (за замовчуванням 8)
#     --tpslimit=10             # кількість HTTP запитів до сервера в сек.
#     --onedrive-chunk-size=1G  # розмір блоку для завантаження файлів
#     --max-backlog=200000      # максимальна кількість синхронізованих об’єктів
# /media/hdd/photo/             # джерело
# "OneDrive":photo              # OneDrive - ідентифікатор з'єднання (ця назва створена на етапі конфігурації)  :  директорія призначення 

rclone sync -P --fast-list --buffer-size=1G --transfers=5 --checkers=40 --tpslimit=10 --onedrive-chunk-size=5M --max-backlog=200000  /media/hdd/photo/ "OneDrive":photo

Копіювання файлів:

rclone copy -P --buffer-size=1G --onedrive-chunk-size=2560K  /media/file.zip "OneDrive":/

Параметр –onedrive-chunk-size для OneDrive має бути кратним 320 KiB (327 680 bytes). За умовчанням він рівний 10 Mi (10 Mi = 10485760 byte), тобто 10485760/320 = 32768. У випадку низької швидкості передачі даних, можна підібрати з ряду: 5M, 2560K, 1280K, 640K.

unison (two-way)

sudo apt-get install unison unison-all
sudo apt install unison unison-gtk      # GUI

unison directory1/ directory2/

gui-tools (two-way)

Пошук / видалення дублікатів

fdupes

sudo apt-get install fdupes

# запис у файл дублікатів з вказанням розміру (пошук по каталогам рекурсивний: ключ -r)
fdupes -r -S /dir > result.txt

# пошук одночасноу декількох каталогах
fdupes -r /dir1 /dir2 /dir3

# отримання узагальненої інформації про кількість та розмір дублікатів
fdupes -r -m /dir

# видалення дублікатів з запитом до користувача (інтерактивний режим)
fdupes -r -d /dir

# зберігання першого файлу з набору дублікатів при видаленні (решта буде видалено автоматично)
fdupes -r -dN /dir

Приклади використання у комбінації з іншими командами:

# отримати вихідний файл
fdupes -r /dir > output.txt

# сортування рядків файлу
sort output.txt > output_sorted.txt

# видалення пустих рядків з файлу
grep "\S" output.txt > output_sorted.txt

# пошук рядків за шаблонома (містить слово 'photo') та сортування
grep "photo" output.txt | sort > output_sorted.txt

# вставка символу " (лапки) на початку та кінці кожного рядка
# для уникнення впливу пробілів в іменах файлів при подальшому використанні команди rm
sed "s/\(.*\)/\"\1\"/" output.txt > output_sorted.txt

# видалення файлів за списком
cat output.txt | xargs rm -f

# видалення порожніх каталогів (рекурсивно)
find ./dir -type d -empty -delete

# просумувати розмір файлів з сортованого списку (вивід в Мб)
cat ./output.txt | xargs du -b | awk -v sum=0 '{print sum+=$1/(1024*1024)}' | tail -1

gui-tools

Фотоархів / Сортування

Пошук дублікатів та схожих фото:

Автоматичне створення дерева каталогів з датами та копіюванням до них фото:

Видалення файлів з назвами в неправильному кодуванні

ls -il
...
012345 -rw-r--r-- .... # потрібний нам файл
...
find . -inum 012345 -exec rm -i {} \;

Пакетна обробка

# рекурсивно замінити в іменах файлів пробіли на знаки підкреслювання
find . -type f  | rename -v 's/ /_/g'

# фільтрація по шаблону (записати в file.txt всі імена файлів, що відповідають шаблону)
find . -regex '.*[hH][0-9].*' > file.txt

# рекурсивний пошук та заміна рядка у всіх файлах
find . -type f -name "*.md" -print0 | xargs -0 sed -i 's/foo/bar/g'