Kopieren des Inhalts des aktuellen Verzeichnisses in ein Unterverzeichnis

13

Wie kann ich mit dem Linux-Terminal alles aus dem aktuellen Verzeichnis in ein Unterverzeichnis kopieren?

Oguz Bilgic
quelle
Meinen Sie kopieren oder verschieben?
Craig

Antworten:

12

Wenn Sie den Inhalt des Ordners rekursiv kopieren möchten (wird 1 Fehler auslösen, Alternativen siehe unten):

cp -r * sub/

Etwas hackiger, funktioniert aber in nicht leeren Unterverzeichnissen:

TARGETDIR='targetdir here';cp -r `find . -maxdepth 1 ! -name "$TARGETDIR"` "$TARGETDIR"

Ein weiterer Oneliner:

TARGETDIR='targetdir here';for file in *;do test "$file" != "$TARGETDIR" && cp "$file" "$TARGETDIR/";done

Oder rekursiv:

TARGETDIR='z';for file in *;do test "$file" != "$TARGETDIR" && cp -r "$file" "$TARGETDIR/";done
Lekensteyn
quelle
Dies funktioniert nicht, falls sub / nicht leer ist -> sub wird erneut in sub kopiert, es sei denn, @Oguz wollte dies.
Ok, ich bin endlich zufrieden mit dem findCode: D
Lekensteyn
2
Ihr zweiter Befehl schlägt für Dateinamen fehl, die Leerzeichen enthalten. Verwenden Sie xargsoder -exec. Keine Notwendigkeit für grep- Verwendung ! -name "$TARGETDIR"oder ähnliches. Sie haben unübertroffene Anführungszeichen $file. Ich glaube nicht, dass ein rekursiver cpBefehl so funktioniert, wie Sie es bei einem anderen Befehl als Ihrem ersten beabsichtigen.
Bis auf weiteres angehalten.
Wohaa, habe in den letzten Codes ein Zitat verpasst. Guter Kommentar Dennis, ich hätte nie gedacht, -name in diesem Fall zu verwenden :)
Lekensteyn
4

Angenommen, targetder Name des Ziel-Unterverzeichnisses lautet, wenn Ihre Shell bash ist:

shopt -s extglob
cp -r !(target) target/

In ksh können Sie direkt tun cp -r !(target) target/.

In zsh kannst du das setopt ksh_globdann machen cp -r !(target) target/. Eine andere Möglichkeit ist setopt extended_globdann cp -r ^target target/.

Gilles 'SO - hör auf böse zu sein'
quelle
2

Ich würde vorschlagen, das Zielverzeichnis außerhalb des Quellverzeichnisses zu verschieben und es dann wieder zurückzusetzen. mv ist kostenlos (wenn Sie darauf achten, nicht in ein anderes Dateisystem zu wechseln), es sei denn, Sie erwarten, dass andere Prozesse stören oder gestört werden.

Die meisten oben aufgeführten Lösungen funktionieren nicht, wenn Dateinamen Leerzeichen enthalten. Ich würde vorschlagen, Varianten von find -print0 | zu verwenden xargs -0 oder find -exec usw.

Alex
quelle
0

Wird das für dich funktionieren?

cp -r * subdir/

Wenn Sie beabsichtigen, zu verschieben, anstatt alles im aktuellen Verzeichnis in ein Unterverzeichnis zu kopieren, können Sie Folgendes tun:

mv * subdir/
karlphillip
quelle
Dies kümmert sich nicht um nicht leere Verzeichnisse
Ich habe es gerade getestet und es hat funktioniert.
Karlphillip
Sie müssen die nicht leeren Verzeichnisse rekursiv kopieren, wie von @Lekensteyn vorgeschlagen.
-1

Dadurch wird alles, einschließlich der Punktdateien und ohne das Zielverzeichnis selbst, in das Zielverzeichnis kopiert SUBDIR:

for i in `ls -a | grep -Ev '^(SUBDIR|\.\.?)$'`; do cp $i SUBDIR; done
ivern
quelle
2
Schlägt für Dateinamen fehl, die Leerzeichen enthalten.
Bis auf weiteres angehalten.
-1

Dies geht in die Datei dirCopy.sh



for i in `ls`
do
        if [ $i != "subDir" ]
        then
                `cp -r $i subDir`
        fi
done

Führen Sie es als "sh dirCopy.sh" in Ihrer Konsole aus

Rahul
quelle
2
Keine Notwendigkeit für ls: for file in *. Keine Backticks erforderlich - verwenden $(). Keine Notwendigkeit für Backticks (oder $()) um den cpBefehl (der eine Fehlermeldung erzeugt).
Bis auf weiteres angehalten.