So kopieren Sie Dateien aus dem Ordner ohne den Ordner selbst

39

Ich versuche, Dateien und Unterordner aus einem Ordner ohne das A selbst zu kopieren . Zum Beispiel A enthalten Ordner weiter:

| file1.txt   
| file2.txt    
| subfolder1   

Beim Ausführen des nächsten Befehls erhalte ich ein falsches Ergebnis:

sudo cp -r /home/username/A/ /usr/lib/B/

Das Ergebnis ist

/usr/lib/B/A/...copied files...

anstatt..

/usr/lib/B/...copied files...

Wie kann ich den erwarteten ohne Ursprungsordner erreichen?

pushandpop
quelle

Antworten:

67

Fortgeschrittene cp

cp -r /home/username/A/. /usr/lib/B/

Dies ist besonders hilfreich, da es unabhängig davon funktioniert, ob das Zielverzeichnis bereits vorhanden ist.

Shell globbing

Wenn das Verzeichnis nicht zu viele Objekte enthält, können Sie Shell-Globbing verwenden:

mkdir -p /usr/lib/B/
shopt -s dotglob
cp -r /home/username/A/* /usr/lib/B/

rsync

rsync -a /home/username/A/ /usr/lib/B/

Das /Ende des Quellpfades ist wichtig; funktioniert unabhängig davon, ob das Zielverzeichnis bereits existiert.

finden

mkdir -p /usr/lib/B/
find /home/username/A/ -mindepth 1 -maxdepth 1 -exec cp -r -t /usr/lib/B/ {} +

oder wenn Sie keine leeren Unterverzeichnisse benötigen:

find /home/username/A/ -mindepth 1 -type f -exec cp --parents -t /usr/lib/B/ {} +

(ohne mkdir)

Hauke ​​Laging
quelle
Der erste funktioniert gut! Irgendwelche Ideen, warum home / username / A / * (mit Sternsymbol) keinen Sinn ergibt? Variante mit Punkt am Ende hat mir geholfen, danke!
pushandpop
@pushandpop A/*macht Sinn, aber es gibt Situationen, in denen es nicht funktioniert.
Hauke ​​Laging
3
shoptist bashspezifisch. Mit zshverwenden *(D). mit ksh93, FIGNORE='@(.|..)'. cp -tist GNU-spezifisch. Das findfunktioniert nicht richtig, da es sowohl A/den Inhalt als auch die Unterverzeichnisse mehrmals kopiert.
Stéphane Chazelas
1
Sie wollen auch -maxdepth 1( -mindepthund -maxdepthGNU-Erweiterungen werden jetzt auch von ein paar anderen unterstützt. Portabel find .../. ! -name . -prune -exec ....)
Stéphane Chazelas
@ StéphaneChazelas Ich glaube, irgendwo gibt es einen Tippfehler. find .../.verursacht hier einen Fehler.
Hauke ​​Laging
10

Wenn auf einem GNU-System, von man cp:

   -T, --no-target-directory
          treat DEST as a normal file

So können Sie cp -rT /home/username/A/ /usr/lib/B/genau das Richtige schreiben .

michas
quelle
Dies sollte die akzeptierte Antwort sein. Dies ist angemessen, als Shell-Globbing durchzuführen oder etwas anderes als zu verwenden cp. Aber das stimmt, dass -Tes mit einem Nicht-GNU nicht funktioniert cp.
Noraj
3

Sagen Sie cp, dass Sie den Inhalt des Verzeichnisses und nicht das Verzeichnis selbst kopieren möchten:

sudo cp -r /home/username/A/* /usr/lib/B/
terdon
quelle
Vielen Dank! Aber es heißt: / usr / lib / B / ist kein Verzeichnis
pushandpop
Sie müssen shopt -s dotglobdafür arbeiten, wenn Dotfiles vorhanden sind /home/username/A/.
Talkloud
1
@pushandpop na ja. Das ist das Ziel, das Sie in Ihrer Frage hatten, also nahm ich an, dass es ein Verzeichnis war. Sie müssen das Ziel erstellen, bevor Sie versuchen, Dateien in das Ziel zu kopieren.
Terdon