Wie kann ich mit dem Linux-Terminal alles aus dem aktuellen Verzeichnis in ein Unterverzeichnis kopieren?
Wie kann ich mit dem Linux-Terminal alles aus dem aktuellen Verzeichnis in ein Unterverzeichnis kopieren?
Antworten:
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
find
Code: D
xargs
oder -exec
. Keine Notwendigkeit für grep
- Verwendung ! -name "$TARGETDIR"
oder ähnliches. Sie haben unübertroffene Anführungszeichen $file
. Ich glaube nicht, dass ein rekursiver cp
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:
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_glob
dann machen cp -r !(target) target/
. Eine andere Möglichkeit ist setopt extended_glob
dann 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.
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/
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
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
ls
: for file in *
. Keine Backticks erforderlich - verwenden $()
. Keine Notwendigkeit für Backticks (oder $()
) um den cp
Befehl (der eine Fehlermeldung erzeugt).