Wie können Sie bestimmte Dateien aus einer Liste von Textdateien verschieben oder kopieren?

Wie können Sie bestimmte Dateien aus einer Liste von Textdateien verschieben oder kopieren?

Ich habe also ein Verzeichnis mit etwa 200 Dateien der folgenden Typen:

gre_6_c1_d34567.h3
gre_6_c1_d95543.h3
gre_6_c1_d42354.h3
gre_6_c1_d01452.h3
gre_6_c1_d23168.h3
gre_6_c1_435435.h3

Der einzige Unterschied zwischen diesen Dateien sind die Nummern nach d. Ich habe eine Textdatei, die nur die Nummern von etwa 50 dieser Dateien enthält . Wenn ich den gesamten Dateinamen bekommen könnte, würde ich das tun, aber diese Textdatei ist die Ausgabe eines anderen Skripts. Gibt es eine Möglichkeit, diese Dateien mithilfe der Nummer aus der Textdatei din ein anderes Verzeichnis zu verschieben ?d

Antwort1

Verwenden sed eder Flagge:

sed 's|^\(.*\)$|mv gre_6_c1_\1.h3 newdir/|e' list.txt

Oben werden die Dateien verschoben, um newdir/sie entsprechend zu ändern.

Ich gehe davon aus, dass die Zahlen in list.txt wie folgt lauten, getrennt durch eine neue Zeile:

d34567
d23168

Führen Sie Folgendes zur Bestätigung aus:

sed 's|^\(.*\)$|mv gre_6_c1_\1.h3 newdir/|' list.txt

Antwort2

Mit bash4 könnten Sie ein Array mit Dateinamen laden, die aus den Nummern in der „Treiber“-Datei abgeleitet wurden, und dann die -tOption von GNU nutzen mv, um sie auf einmal in ein Verzeichnis zu verschieben. Hinweis

#read contents of driver_file into an array arr using mapfile
mapfile -t arr <driver_file

#define prefix and suffix variables
prefix=gre_6_c1_d
suffix=.h3

#prefix each array element
arr=("${arr[@]/#/$prefix}")

#suffix each array element
arr=("${arr[@]/%/$suffix}")

#use GNU mv's -t facility to move files into newdir
mv -t newdir/ "${arr[@]}"

Antwort3

Die Zahlen einzeln aus der Datei lesen und den Vorgang ausführen (setzt eine POSIX-Shell voraus):

while read -r number; do
   name="gre_6_c1_d$number.h3"
   [ -f "$name" ] && mv -i "gre_6_c1_d$number.h3" /other/directory
done <number.list

Dadurch wird auch sichergestellt, dass die Nummer den Namen einer im aktuellen Verzeichnis vorhandenen Datei ergibt, bevor sie in das andere Verzeichnis verschoben wird. Der mv -iBefehl fragt außerdem nach einer Bestätigung, bevor eine vorhandene Datei überschrieben wird.


Da diese Frage mit dem Tag versehen war, wir könnten darum bitten, xargsdie Nummernliste für uns zu generieren:

xargs sh -c '
    for number do
        name="gre_6_c1_d$number.h3"
        [ -f "$name" ] && mv "gre_6_c1_d$number.h3" /other/directory
    done' sh <number.list

Dies würde zwar nichts beschleunigen, aber wenn Sie xargsein -PFlag für die parallele Ausführung von Dingen angeben, könnten Sie eine kleine Geschwindigkeitssteigerung erzielen:

xargs -P 5 -n 10 -h sh -c '
    for number do
        name="gre_6_c1_d$number.h3"
        [ -f "$name" ] && mv "gre_6_c1_d$number.h3" /other/directory
    done' sh <number.list

Dadurch werden höchstens fünf Kopien der Schleife parallel gestartet und jeweils höchstens zehn Zahlen in Stapeln ausgegeben.

verwandte Informationen