Як безпечно переміщувати файли в один каталог?


10

Як я можу переміщувати файли в каталог, де в каталозі може бути сотні чи тисячі файлів, і ви можете бути не впевнені, чи є в ній дупи ... Який метод ви б використали?

Як поводитися з дупами, буде різним, іноді ми перепишемо, інколи нам потрібно бути безпечнішими. IO може бути важливим, оскільки це виробничі сервери. Але запит на кількість не повторюваних файлів не є варіантом. Важливим є збереження дозволів, часових позначок тощо. Зазвичай ми не знаємо, що це за дані.

Ну, і це використання mvне потрібно rsync, cpрішення вітаються.

Примітка: ми запускаємо CentOS 5.5, тому дайте мені знати, якщо він не працюватиме через те, що він був нещодавнішою ... функцією


Що б ypu хотіли зробити з дупами?

@Iain залежить від ситуації? Я працюю в веб-хості ... це дійсно залежить від того, mvчи ми піклуємося про збереження у випадку ... та чи вже ми створили резервну копію. Це питання досить відкрите. Я просто шукаю хороші варіанти, а можливо коментар про те, чи може це вас вкусити чи ні.
ксенотеррацид

Я припускаю, що занадто багато файлів для оболонки для обробки mv * ../або mv -i * ../?
Майкл Мрозек

@Michael Я впевнений, що це змінюється ... в деяких випадках, мабуть, ні. У деяких випадках можливо. Я намагаюся спіймати якомога більше варіантів моєї роботи env.
ксенотеррацид

Відповіді:


6

Я рекомендую використовувати rsync від батьків:

rsync -avPr -b --suffix='-original' child/* .

який створить резервну копію всіх існуючих дублікатів у батьківському файлі -original.


Я думаю, -aмається на увазі-r
ксенотерацид

@xenoterracide - Right you 'r'
Tok

@Ток чи можна зробити копію як жорсткі посилання? щоб не витрачати ІО. (як -lдля cp)
ксенотеррацид

@xenoterracide - Ви можете використовувати прапорці -Hабо --hard-linksrsync для збереження жорстких посилань.
Ток

1
@xenoterracide - Ви можете використовувати --link-dest=DIRпрапор, щоб досягти такої поведінки як: rsync -avP --link-dest=/path/to/src /path/to/src/* /path/to/dest/що дозволить жорстко зв’язатись у dst / будь-які незмінені файли між src та src, у цьому випадку всі файли. Зазвичай ви бачите цей прапор, який використовується під час повторного посилання файлів резервного копіювання без копіювання їх даних, таких як --link-dest=/most/recent/backup.
Ток

4
cp -bal . ..

Це скопіює все, що знаходиться в поточному каталозі, в каталог над ним, зберігши всі дозволи, використовуючи жорсткі посилання, щоб мінімізувати IO, якщо це можливо, і для дублікатів створить ім'я файлу ~

після того

rm -rf . ; cd .. ; rmdir <originaldir>;

ймовірно, наштовхується на велику кількість видань файлів ..., але не є інтенсивним IO, як rsync.
ксенотеррацид

2

У цьому прикладі буде переміщено файли з '/ parent / old-dir' в '/ parent':

cd /parent

rsync -av --progress old-dir/ .

rm -rf old-dir

За правилами rsync він замінить дуппи на новіші файли з old-dir.


1

Ви можете спробувати

find . -maxdepth 1 -print0 | xargs -I '{}' -r0 mv '{}' ..

який замінить файли dupe у ..

Ви можете використовувати mv -u '{}', щоб не перезаписати, якщо дупа в .. однакова чи новіша


чому трубу знайти до xargs? чому б не використати +
ксенотерацид

1
@xenoterracide - звичність та мобільність (це розширення GNU). Крім того, я просто спробував і не можу зрозуміти, як передати другій параметр ..в mv '{}' +команді як + тільки додає до кінця.

@Iain + є в POSIX, мені фактично говорили, що раніше GNU знайшов, щоб його отримати.
ксенотеррацид

Ви маєте рацію, але я все ще не можу знайти спосіб використання ..

2
@xenoterracide: З GNU Coreutils: -exec mv -t .. -- {} +. Портабельная: -exec sh -c 'mv -- "$@"' _ {} +.
Жил "ТАК - перестань бути злим"

1

mv -i підкаже лише те, що місце призначення існує.

yes n | mv -i …переміщує всі файли, які не існують у каталозі призначення. На FreeBSD та OSX ви можете скоротити це до mv -n ….

Зауважте, що жодне з них не об'єднає аргумент каталогу з існуючим каталогом з тим самим іменем у каталозі призначення.


Окреме питання - як діяти на всі файли в поточному каталозі. Є дві проблеми: захоплення всіх файлів ( *упускає крапкові файли) та не запуск у командний рядок. У Linux (або загалом з GNU find та GNU coreutils):

find . -mindepth 1 -maxdepth 1 -exec mv -i -t .. -- {} +

Якщо GNU знаходить, але не GNU coreutils (або старіші GNU coreutils):

find . -mindepth 1 -maxdepth 1 -exec sh -c 'mv -i -- "$@" "$0"' .. {} +

Портативно:

find . -name . -o -exec sh -c 'mv -i -- "$@" "$0"' .. {} -type d -prune

Як завжди zsh полегшує справи. Він не має внутрішнього обмеження довжини командного рядка, тому якщо ви використовуєте його mvвбудований, вам не потрібно буде про це турбуватися. І ви можете сказати, щоб не ігнорувати крапкові файли з Dглобальним класифікатором. Обмеження: це не працює в файлових системах (станом на zsh 4.3.10).

zmodload zsh/files
mv -i -- *(D) ..

на багато аргументів?
ксенотеррацид

0

Я сказав про наш ML

mv * ..

очевидно, це не дуже безпечно ... це перезаписає речі. Це може мати обмеження, до яких я ніколи не стикався.


2
Якщо у вас є велика кількість файлів, ви, швидше за все, отримаєте "аргумент задовго помилки".

2
Це може зробити погано, якщо у вас є ім'я файлу, яке починається з -. Він не буде ловити файли, з імені яких починається ..
Жил "ТАК - перестань бути злим"

0

Далі йде шаблон python, який я раніше використовував для хорошого ефекту.

#!/usr/bin/env python
#
# Bart Kastermans, www.bartk.nl
#
# rename of collection of files in a directory
import os
import shutil

# only work on files whose name starts with a D
files = [filename for filename in os.listdir ("/Users/kasterma/Music/Audio Hijack/") if filename[0] =="D"]

for filename in files:
    shutil.move (filename, filename [:23] + ".mp3")
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.