Wie können Sie Dateien sicher in einem Verzeichnis verschieben?

10

Wie kann ich Dateien bewegen ein Verzeichnis, wo es vielleicht Hunderte oder Tausende von Dateien in dem Verzeichnis befinden , und Sie können nicht sicher sein , ob es Betrogenen in ... Welche Methode würden Sie verwenden?

Der Umgang mit Dupes ist unterschiedlich, manchmal werden wir überschreiben, manchmal müssen wir sicherer sein. E / A kann wichtig sein, da dies Produktionsserver sind. Bei gegebener Menge ist eine Aufforderung zur Eingabe nicht doppelter Dateien jedoch keine Option. Die Beibehaltung von Berechtigungen, Zeitstempeln usw. ist wichtig. Wir werden normalerweise nicht wissen, was die Daten sind.

Oh und es mvist nicht erforderlich rsync, cpLösungen willkommen.

Hinweis: Wir verwenden CentOS 5.5. Lassen Sie mich wissen, wenn es dort nicht funktioniert, da es sich um eine neuere ... Funktion handelt

Xenoterracid
quelle
Was würdest du mit Dupes machen wollen?
@Iain hängt von der Situation ab? Ich arbeite bei einem Webhost ... es hängt wirklich davon ab, mvob und wie uns die Aufbewahrung im Fall von ... wichtig ist und ob wir bereits ein Backup erstellt haben. Diese Frage ist ziemlich offen. Ich suche nur nach guten Optionen und vielleicht nach einem Kommentar darüber, ob und wie es dich beißen kann oder nicht.
Xenoterracide
Ich nehme an, es gibt zu viele Dateien für die Shell mv * ../oder mv -i * ../?
Michael Mrozek
@ Michael Ich bin sicher, es variiert ... in einigen Fällen wahrscheinlich nicht. In einigen Fällen vielleicht. Ich versuche so viele Optionen wie möglich für meine Arbeit zu finden.
Xenoterracide

Antworten:

6

Ich würde empfehlen, rsync vom übergeordneten Element zu verwenden:

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

Dadurch werden alle vorhandenen doppelten Dateien im übergeordneten Element in der Datei -original gesichert.

Tok
quelle
Ich denke -aimpliziert-r
Xenoterracide
@ Xenoterracide - Richtig du 'r'
Tok
@Tok ist es möglich, die Kopien als Hardlinks zu erstellen? um IO nicht zu verschwenden. (wie -lfür cp)
Xenoterracide
@xenoterracide - Sie können die Flags -Hoder --hard-linksfür rsync verwenden, um feste Links beizubehalten .
Tok
1
@xenoterracide - Sie können das --link-dest=DIRFlag verwenden, um dieses Verhalten zu erreichen: Es rsync -avP --link-dest=/path/to/src /path/to/src/* /path/to/dest/wird eine feste Verknüpfung zu dst / unveränderten Dateien zwischen src und src, in diesem Fall allen Dateien, hergestellt. Normalerweise wird dieses Flag verwendet, wenn Sie Sicherungsdateien erneut verknüpfen möchten, ohne deren Daten zu kopieren, z --link-dest=/most/recent/backup.
Tok
4
cp -bal . ..

Dadurch wird alles im aktuellen Verzeichnis in das darüber liegende Verzeichnis kopiert, wobei alle Berechtigungen beibehalten werden. Wenn möglich, werden Hardlinks verwendet, um die E / A zu minimieren. Bei Duplikaten wird der Dateiname ~ erstellt

danach

rm -rf . ; cd .. ; rmdir <originaldir>;
Xenoterracid
quelle
Wahrscheinlich tritt das Problem mit der großen Anzahl von Dateien auf ... aber es ist nicht E / A-intensiv wie rsync.
Xenoterracide
2

In diesem Beispiel werden Dateien von '/ parent / old-dir' nach '/ parent' verschoben:

cd /parent

rsync -av --progress old-dir/ .

rm -rf old-dir

Durch rsync-Regeln werden Dups durch neuere Dateien aus ersetzt old-dir.

Alexander Pogrebnyak
quelle
1

Du kannst es versuchen

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

das wird betrogene Dateien in .. überschreiben.

Sie können mv -u '{}' verwenden, um nicht zu überschreiben, wenn der Dupe in .. gleich oder neuer ist


quelle
Warum Pfeife zu Xargs finden? Warum nicht +
Xenoterracide
1
@xenoterracide - Gewohnheit und Portabilität (es ist eine GNU-Erweiterung). Darüber hinaus habe ich es gerade versucht und kann nicht herausfinden, wie der zweite Parameter ..an den mv '{}' +Befehl übergeben wird, da das + nur am Ende hinzugefügt wird.
@Iain das + ist in POSIX. Mir wurde tatsächlich gesagt, dass der GNU-Fund zu spät war, um es zu bekommen.
Xenoterracide
Sie haben Recht, aber ich kann immer noch keine Möglichkeit finden, die ..
2
@ Xenoterracide: Mit GNU Coreutils : -exec mv -t .. -- {} +. Tragbar : -exec sh -c 'mv -- "$@"' _ {} +.
Gilles 'SO - hör auf böse zu sein'
1

mv -i fordert nur auf, wenn das Ziel vorhanden ist.

yes n | mv -i …verschiebt alle Dateien, die nicht im Zielverzeichnis vorhanden sind. Unter FreeBSD und OSX können Sie dies auf kürzen mv -n ….

Beachten Sie, dass keines dieser Elemente ein Verzeichnisargument mit einem vorhandenen Verzeichnis mit demselben Namen im Zielverzeichnis zusammenführt.


Ein separates Problem ist, wie auf alle Dateien im aktuellen Verzeichnis reagiert wird. Es gibt zwei Probleme: Alle Dateien *abrufen ( Punktdateien werden weggelassen) und keine Befehlszeile angezeigt. Unter Linux (oder allgemeiner mit GNU find und GNU coreutils):

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

Mit GNU finden, aber nicht GNU-Coreutils (oder ältere GNU-Coreutils):

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

Tragbar:

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

Wie immer macht zsh die Sache einfacher. Es gibt intern keine Beschränkung der Befehlszeilenlänge. Wenn Sie also die integrierte mvBefehlszeile verwenden, müssen Sie sich darüber keine Gedanken machen. Und Sie können festlegen, dass Punktdateien mit dem DGlob-Qualifikationsmerkmal nicht ignoriert werden sollen . Einschränkung: Dies funktioniert nicht in allen Dateisystemen (ab zsh 4.3.10).

zmodload zsh/files
mv -i -- *(D) ..
Gilles 'SO - hör auf böse zu sein'
quelle
zu vielen Argumenten?
Xenoterracide
0

Ich sagte auf unserer ML

mv * ..

Offensichtlich ist dies nicht sehr sicher ... es wird Dinge überschreiben. Es könnte Grenzen haben, auf die ich nie gestoßen bin.

Xenoterracid
quelle
2
Wenn Sie eine große Anzahl von Dateien haben, erhalten Sie wahrscheinlich einen Fehler "Argumentliste zu lang".
2
Es kann schlimme Dinge tun, wenn Sie einen Dateinamen haben, der mit beginnt -. Es werden keine Dateien abgefangen, deren Name mit beginnt ..
Gilles 'SO - hör auf böse zu sein'
0

Das Folgende ist eine Python-Vorlage, die ich in der Vergangenheit effektiv verwendet habe.

#!/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")
Kasterma
quelle