alles außer x kopieren

P

pospiech

Doppel-As
Ich möchte über ein Skript Sicherungen anlegen. Dabei möchte ich alle Verzeichnisse und Dateien inklusive der mit "." startenden Dateien kopieren, zusätzlich aber wenige Verzeichnisse, z.B. ".kde/" auslassen.
Ein "cp .*" führt dazu das auch "." und ".." miteinbezogen werden. Damit kann ich wohl nicht arbeiten.

Wie kann man daher derartige Kopieraktionen anweisen ?

Matthias
 
Ein * steht für beliebig viele Zeichen, ein ? für exakt eins.
Also könnte man es mit einem Konstrukt lösen, das .??* heißt (vorausgesetzt, nach dem Punkt kommen immer mindestens zwei Zeichen und Du nennst Deine Verzeichnisse nicht .a oder so).

Gruß
 
ls -A liefert alles ausser . und ..
Man könnte das ganze mit grep verbinden, so etwa

Code:
ls -A | grep -v .kde | xargs cp {} /backup

Gruss, Xanti
 
Zuletzt bearbeitet:
Xanti schrieb:
Code:
ls -A | grep -v .kde | xargs cp {} /backup
Wie kann ich denn hierbei mehere Argumente übergeben. Mir ist nur eingefallen beliebig viele grep hintereinander zu kombinieren, was mir aber zu umständlich ist.

Dann wüsste ich gerne noch wie ich alle Verzeichnisse auswähle. Ein 'ls -d' liefert mir immer nur "."

Matthias
 
Da würde ich find empfehlen:

Code:
find . -maxdepth 1 -type d -not -name bla -not -name blabla -exec cp {} /backup \;

Zur Not xargs benutzen, wenn die Anzahl der gematchten Verzeichnisse zu gross wird.
 
Neues Problem:

Code:
cd /usr/local/share/fonts/
ls /usr/local/share/fonts/ | xargs cp {} /home/matthias/SystemSicherung/fonts/

liefert nur "ul9ro8a.pfb is not a directory"
was ich nicht verstehe.

Matthias
 
Zur Datensicherung solltest Du nicht cp alleine benutzen. Schau Dir mal rsync an. Dort kannst Du mit der Option '--exclude-from=file' in die Datei 'file' die Pfade/ Dateien eintragen, die nicht mitkopiert werden sollen.
Ausserdem kannst Du, wenn Du jeden Tag/ jede Woche in ein anderes Verzeichnis sicherst, mittels '--link-dest' angeben, wo das alte Backup liegt, und es werden nur die geaenderten Dateien kopiert. Auf die ungeaenderten werden hard-links gesetzt, was Platz spart.
 
pospiech schrieb:
Neues Problem:

Code:
cd /usr/local/share/fonts/
ls /usr/local/share/fonts/ | xargs cp {} /home/matthias/SystemSicherung/fonts/

liefert nur "ul9ro8a.pfb is not a directory"
was ich nicht verstehe.

Matthias

Hmm, bist Du Dir sicher, dass er nicht "ul9ro8a.pfb is a directory" meint? Diese musst Du mit cp -r rekursiv kopieren.

Gruss, Xanti
 
Ich erklär vielleicht mal was ich damit bezwecken will. Jedemal wenn ich den Rechner (bzw die Rechner) neu installiere, dann will ich vorher /etc/, alle versteckten Dateien in home, .kde in home .texmf in home, .cxoffice in home, alle fonts in /usr/local/share/fonts/, alle Skripte in ~/bin/ aber nicht die Unterverzeichnisse
gesammelt sichern, und das auf allen Rechnern. Und das würde ich gerne mit einem Skript erledigen.

Es handelt sich daher wirklich nur um Kopieraktionen, die sich nur leider mit cp alleine nicht erledigen lassen. Dafür mich in rsync einzuarbeiten erscheint mir overkill, zumal ich es eigentlich gestern fertig haben wollte, nur leider wegen diverser Probleme nicht vorankommen, wie z.B., das cp nicht kopiert, oder ls -d mir keine Verzeichnisse anzeigt.

Hmm, bist Du Dir sicher, dass er nicht "ul9ro8a.pfb is a directory" meint? Diese musst Du mit cp -r rekursiv kopieren.
ja ganz sicher. Das Verzeichnis enthält nämlich keine Unterverzeichnisse, weshalb ich kein cp -r machen bräuchte.

Matthias
 
Zuletzt bearbeitet:
pospiech schrieb:
...
oder ls -d mir keine Verzeichnisse anzeigt.
...
ja ganz sicher. Das Verzeichnis enthält nämlich keine Unterverzeichnisse, weshalb ich kein cp -r machen bräuchte.

Matthias

Vielleicht solltest Du Dir die man-Page von ls und cp nochmal ganz genau durchlesen.
 
Xanti schrieb:
Vielleicht solltest Du Dir die man-Page von ls und cp nochmal ganz genau durchlesen.
Nicht das ich die schon gelesen hätte. Was willst du mir genau sagen ?

Matthias
 
pospiech,

Du willst vor dem neu installieren sichern, und das (Zitat: auf allen Rechnern). Glaub mir, es lohnt sich, sich entweder mit rsync oder mit tar oder mit beidem eingehend zu beschäftigen. Eine Quick&Dirty-Lösung mit cp ist nicht das richtige. Glaub mir, Du willst das richtig machen und Du willst es sauber haben, spätestens wenn Du die Daten nach der Neuinstallation wieder zurück spielst. tar ist nicht unbedingt die schlechteste Wahl: hier kannst Du beispielsweise eine Liste angeben, die ausgeschlossen werden soll:

Code:
server:/home # tar cf sicherung.tar * --exclude-from=/home/exclude

In dem File /home/exclude kannst Du alles eintragen, was Du ausschließen willst. Dasselbe gilt für rsync.

Ich empfehle das dringend.


Gruß
 
Ich bastel auch schon an einer Lösung mit tar. Dafür muss ich mir jetzt nur noch die exclude Listen zusammenbasteln. Warum meine Vorgehensweise mit ls und cp nicht funktioniert wäre trotzdem interessant.

Matthias
 
Sieht so aus, als wurde die Datei ul9ro8a.pfb durch xargs zum letzten Argument von cp. Vielleicht musst Du 'command' in Anfuehrungszeichen setzen, da sonst das Zielverzeichnis zusammen mit den Argumenten, die durch ls geliefert werden, in einen Hut geschmissen werden?
 
rikola schrieb:
Sieht so aus, als wurde die Datei ul9ro8a.pfb durch xargs zum letzten Argument von cp. Vielleicht musst Du 'command' in Anfuehrungszeichen setzen, da sonst das Zielverzeichnis zusammen mit den Argumenten, die durch ls geliefert werden, in einen Hut geschmissen werden?

Vielleicht ist die Anzahl der Files zu gross und cp schneidet hinter ul9ro8a.pfb ab. Dann müsste die xargs-Option -n1 Abhilfe schaffen.

Gruss, Xanti
 
Hallo

  1. Ist rsync genau für solche Dinge gedacht
  2. Ist die Manpage von rsync sehr gut
  3. Ist einzig das Rumstochern ohne genaue Kenntnisse overkill , das Einlesen in eine Manpage dagegen nie.
  4. sollte die Option -1 beim ls Abhilfe schaffen
  5. Könnte man auch grep eine Liste mitgeben.
Alles was in der Datei excludeliste steht nicht ausgeben:
cat irgendwas_fuer_die_pipe| grep -f excludeliste -v

Gruß Wolfgang
 
Danke für die ganzen Antworten. Inwischen habe ich das meiste umsetzen können. Allerdings möchte ich nun aus dem Home Verzeichnis nur die Versteckten Dateien und Verzeichnisse sichern. Ich habe aber nicht herausfinden können wie ich nur die Versteckten Dateien/Verzeichnisse selektiere.


Anonsten sieht das Skript derzeit so aus:
Code:
#!/bin/bash
#
# --------------------------------------------------------- #
# Skript zum Sichern wichtiger Einstellungen im System vor  #
# einem Update des Systems                                  #
# --------------------------------------------------------- #

# *** Variabelen *** --------------------------------------
SAVEDIR="$HOME/SystemSicherung"
EXCLUDE="$SAVEDIR/exclude.txt"
FONTDIR=/usr/local/share/fonts/

# --------------------------------------------------------- #
create_dir ()
{
	if [ -d "$1" ]  # Test if target directory exists. 
	then
		echo "" 
	else
		mkdir $1		
	fi
	return 0   # Success.
}  

# --------------------------------------------------------- #
create_file ()
{
	if [ -e "$1" ]  # Test if target exists.
	then
		rm $1		
	fi
	touch $1	
	return 0   # Success.
}  

# --------------------------------------------------------- #
append_DirInDir ()
{
	SEARCHDIR=$1
	WRITEFILE=$2	
	find $SEARCHDIR -maxdepth 1 -type d -not -name $SEARCHDIR -not -name . | grep $SEARCHDIR/ >> $WRITEFILE
	return 0
}


# == MAIN ================================================= #
# Verzeichnis zum Speichern erstellen
create_dir $SAVEDIR

# Sichern von ~/bin/ -------------------------------------- #
FROMDIR="$HOME/bin"
DESTDIR="$SAVEDIR/HomeBin"
echo "> Sichern von $FROMDIR"
create_dir $DESTDIR
create_file $EXCLUDE
append_DirInDir $FROMDIR $EXCLUDE	
# c: copy
# p: keep permission	
# x: extract
# v: verbose
echo "> Kopieren..."
tar cp --exclude-from=$EXCLUDE $FROMDIR | (cd $DESTDIR ; tar xp)
echo "> Packen..."
tar cpz --exclude-from=$EXCLUDE $FROMDIR > "$SAVEDIR/HomeBin.tar.gz"

# Sichern von Fonts aus /usr/local/share/fonts/ ----------- #
FROMDIR="/usr/local/share/fonts/"
DESTDIR="$SAVEDIR/Fonts"
echo "> Sichern von $FROMDIR"
create_dir $DESTDIR
create_file $EXCLUDE
echo "> Kopieren..."
tar cp --exclude-from=$EXCLUDE $FROMDIR | (cd $DESTDIR ; tar xp)
echo "> Packen..."
tar cpz --exclude-from=$EXCLUDE $FROMDIR  > "$SAVEDIR/UsrLocalShareFonts.tar.gz"

# Sichern von .texmf ------------------------------------- #
FROMDIR="$HOME/.texmf"
DESTDIR="$SAVEDIR/HomeTexmf"
echo "> Sichern von $FROMDIR"
create_dir $DESTDIR
create_file $EXCLUDE
echo "> Kopieren..."
tar cp --exclude-from=$EXCLUDE $FROMDIR | (cd $DESTDIR ; tar xp)
echo "> Packen..."
tar cpz --exclude-from=$EXCLUDE $FROMDIR  > "$SAVEDIR/HomeTexmf.tar.gz"

# Sichern von  .cxoffice ------------------------------------- #
FROMDIR="$HOME/.cxoffice"
DESTDIR="$SAVEDIR/HomeCxoffice"
echo "> Sichern von $FROMDIR"
create_dir $DESTDIR
create_file $EXCLUDE
echo "> Kopieren..."
tar cp --exclude-from=$EXCLUDE $FROMDIR | (cd $DESTDIR ; tar xp)
echo "> Packen..."
tar cpz --exclude-from=$EXCLUDE $FROMDIR  > "$SAVEDIR/HomeCxoffice.tar.gz"

# Sichern von .kde/share/apps/kmail ------------------------------------- #
FROMDIR="$HOME/.kde/share/apps/kmail"
DESTDIR="$SAVEDIR/Mail$USER"
echo "> Sichern von $FROMDIR"
create_dir $DESTDIR
create_file $EXCLUDE
echo "> Kopieren..."
tar cp --exclude-from=$EXCLUDE $FROMDIR | (cd $DESTDIR ; tar xp)
echo "> Packen..."
tar cpz --exclude-from=$EXCLUDE $FROMDIR  > "$SAVEDIR/HomeKmail$USER.tar.gz"

# Sichern von .kde/ ohne .kde/share/apps/kmail --------------------------- #
FROMDIR="$HOME/.kde"
DESTDIR="$SAVEDIR/HomeKDE"
echo "> Sichern von $FROMDIR"
create_dir $DESTDIR
create_file $EXCLUDE
echo "$HOME/.kde/share/apps/kmail" > $EXCLUDE
echo "> Kopieren..."
tar cp --exclude-from=$EXCLUDE $FROMDIR | (cd $DESTDIR ; tar xp)
echo "> Packen..."
tar cpz --exclude-from=$EXCLUDE $FROMDIR  > "$SAVEDIR/HomeKDE.tar.gz"


# 7) Versteckte Dateien in Home ohne .texmf, .cxoffice, .kde
# 8) /etc/ --> als Root


cd $HOME
exit 0
# --------------------------------------------------------- #

EDIT:
Die nichtversteckten Dateien konnte ich inzwishen über ein simples 'ls -1' auswählen und darüber meine ausschlussliste zusammenstellen:
Code:
echo "$HOME/.kde" >> $EXCLUDE
echo "$HOME/.texmf" >> $EXCLUDE
echo "$HOME/.cxoffice" >> $EXCLUDE
cd $HOME
ls -1 $HOME >> $EXCLUDE

wie ich allerdings das gegenteil selektiere ist mir noch immer unklar

Matthias
 
Zuletzt bearbeitet:
Hallo

Falls du mit versteckt die Dateien meinst, welche mit einem Punkt beginnen:

ls -1A|egrep "^\." >exclude

Gruß Wolfgang
 
Was macht denn egrep anders als grep, und was bedeutet das ^ in "^\." ?
(Oder wo kann ich das nachlesen, man von egrep ohne ein Beispiel habe ich nicht nachvollziehen können)

Matthias
 

Ähnliche Themen

suchen und ersetzen, Format erhalten

Afänger braucht Hilfe - /temp ist voll, kde geht nicht, wie weiter ??

Dateien aus mehreren Ordnern in einen kopieren

Anleitung: Howto: OpenSUSE 10, XDMCP und Cygwin als Thin-Client

Compileroptionen

Zurück
Oben