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/.
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.
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).
Antworten:
Wenn Sie den Inhalt des Ordners rekursiv kopieren möchten (wird 1 Fehler auslösen, Alternativen siehe unten):
Etwas hackiger, funktioniert aber in nicht leeren Unterverzeichnissen:
Ein weiterer Oneliner:
Oder rekursiv:
quelle
find
Code: Dxargs
oder-exec
. Keine Notwendigkeit fürgrep
- Verwendung! -name "$TARGETDIR"
oder ähnliches. Sie haben unübertroffene Anführungszeichen$file
. Ich glaube nicht, dass ein rekursivercp
Befehl so funktioniert, wie Sie es bei einem anderen Befehl als Ihrem ersten beabsichtigen.Angenommen,
target
der Name des Ziel-Unterverzeichnisses lautet, wenn Ihre Shell bash ist:In ksh können Sie direkt tun
cp -r !(target) target/
.In zsh kannst du das
setopt ksh_glob
dann machencp -r !(target) target/
. Eine andere Möglichkeit istsetopt extended_glob
danncp -r ^target target/
.quelle
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.
quelle
Wird das für dich funktionieren?
Wenn Sie beabsichtigen, zu verschieben, anstatt alles im aktuellen Verzeichnis in ein Unterverzeichnis zu kopieren, können Sie Folgendes tun:
quelle
Dadurch wird alles, einschließlich der Punktdateien und ohne das Zielverzeichnis selbst, in das Zielverzeichnis kopiert
SUBDIR
:quelle
Dies geht in die Datei dirCopy.sh
Führen Sie es als "sh dirCopy.sh" in Ihrer Konsole aus
quelle
ls
:for file in *
. Keine Backticks erforderlich - verwenden$()
. Keine Notwendigkeit für Backticks (oder$()
) um dencp
Befehl (der eine Fehlermeldung erzeugt).