
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 d
in ein anderes Verzeichnis zu verschieben ?d
Antwort1
Verwenden sed
e
der 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 bash
4 könnten Sie ein Array mit Dateinamen laden, die aus den Nummern in der „Treiber“-Datei abgeleitet wurden, und dann die -t
Option 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 -i
Befehl fragt außerdem nach einer Bestätigung, bevor eine vorhandene Datei überschrieben wird.
Da diese Frage mit dem Tag versehen warxargs, wir könnten darum bitten, xargs
die 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 xargs
ein -P
Flag 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.