
Ich habe einen Pfad /participant/data, in dem sich alle Dateien im Datenverzeichnis befinden. Ich möchte jedoch, dass die Verzeichnisstruktur /participant/data/subdirectory lautet, wobei das Unterverzeichnis alle Dateien enthält. Dies muss so sein, damit es eine Pipeline durchläuft.
Mein erster Gedanke war
mkdir /Teilnehmer/Daten/Unterverzeichnis/
mv /Teilnehmer/Daten/*.* /Teilnehmer/Daten/Unterverzeichnis/
Die Dateien haben jedoch keine Dateierweiterung, daher funktioniert die Verwendung von *.* nicht. Irgendwelche Vorschläge, wie man das machen kann?
Antwort1
Einfach alles verschieben:
mv /participant/data/* /participant/data/subdirectory/
Dies beschwert sich darüber, dass es nicht subdirectory
in sich selbst verschoben werden kann, verschiebt aber trotzdem alles andere wie gewünscht in dieses Unterverzeichnis.
Bash shopt -s extglob
fügt einige zusätzliche Platzhalterzeichen hinzu, um beispielsweise !(xy|z)
alles zu finden, wie*
außer xy
oder z
:
shopt -s extglob
mv /participant/data/!(subdir) /participant/data/subdir/
(Zsh hat wahrscheinlich noch mehr erweiterte Platzhalter, die nur auf Dateien zutreffen.)
Wenn Sie über mehrere Unterverzeichnisse verfügen und diese nicht ändern möchten, können Sie mit Tools wie find
oder fd
nur bestimmte Elemente bearbeiten, in diesem Fall nur Dateien:
find /participant/data -maxdepth 1 -type f -exec mv {} /participant/data/subdir/ \;
Dies wäre mit mv -t
und etwas effizienter -exec +
:
find /participant/data -maxdepth 1 -type f -exec mv -t /participant/data/subdir {} +
Das vorherige (langsamere) Beispiel kann auch als Shell- for
Schleife geschrieben werden:
for x in /participant/data/*; do
if [[ -f $x ]]; then mv "$x" /participant/data/subdirectory/; fi
done
Antwort2
Sie können *
anstelle von verwenden *.*
, um alle Dateien unabhängig vom Dateinamen einzuschließen.
Dies würde jedoch auch Verzeichnisse einschließen, einschließlich subdirectory
, daher müssen Sie es beim Verschieben der Dateien ausschließen.
Dies ist mit den erweiterten Pattern-Matching-Funktionen möglich. Diese müssen zunächst (für die aktuelle Sitzung) aktiviert werden:
$ shopt -s extglob
Anschließend können Sie alle Dateien bis auf eine ansprechen mitpath/!(excludedFile)
Implementiert in mv
:
$ mv /participant/data/!(subdirectory) /participant/data/subdirectory/
Es gibt weitere Optionen zum Verschieben aller Dateien außer einer:https://www.baeldung.com/linux/alle-dateien-außer-einer-verschieben
Antwort3
In der von Ihnen beschriebenen Situation ist es am einfachsten:
cd /participant/data
mkdir .tempname
mv * .tmpname
mv .tmpname subdirectory
Das * stimmt mit allen Verzeichniseinträgen überein, die nicht ausgeblendet sind, also mit allen, die nicht mit einem Punkt beginnen. Da wir den Unterverzeichnisnamen vorübergehend mit einem Punkt begonnen haben, stimmt er nicht überein und alle Einträge in den Daten werden verschoben. Wenn Sie nun einige Einträge haben, die Sie nicht verschieben möchten, z. B. andere Unterverzeichnisse, müssen Sie eine der komplexeren Methoden verwenden, wie die in der ausführlichen Antwort von user1686.