
Ich versuche, zahlreiche Dateien aus einem Hauptverzeichnis in separate Verzeichnisse mit mehreren Unterverzeichnissen zu verschieben.
Beispielhafte Dateibenennungskonventionen: 1SA_1BA_1W.out, 2SA_3BA_3W.out, 4SA_2BA_5W.out... Gibt es eine Möglichkeit, alle SA-, BA-, W- oder anderen Elemente, die ich habe, auf einmal an einen bestimmten Ort zu verschieben, wenn die Nummer vor ihnen angegeben ist? Die Bereiche für SA wären 1-10, für BA 1-4 usw. Derzeit verwende ich einen Skriptbefehl wie …
find . -type f -name '1A_1HNO3_W.out' | xargs -I {} cp '{}' /location/A_HNO3
find . -type f -name '2SA_BA_W.out' | xargs -I {} cp '{}' /location/SA_BA_W
find . -type f -name '3SA_BA_W.out' | xargs -I {} cp '{}' /location/SA_BA_W
find . -type f -name '4SA_BA_W.out' | xargs -I {} cp '{}' /location/SA_BA_W
find . -type f -name '1SA_DEA_W.out' | xargs -I {} cp '{}' /location/SA_DEA_W
find . -type f -name '2SA_DEA_W.out' | xargs -I {} cp '{}' /location/SA_DEA_W
find . -type f -name '3SA_DEA_W.out' | xargs -I {} cp '{}' /location/SA_DEA_W
find . -type f -name '4SA_DEA_*W.out' | xargs -I {} cp '{}' /location/SA_DEA_W
habe über 1700 Dateien mit verschiedenen Identifikationsabkürzungen, wie SA BA A HNO3 W MA EAM TMA DMA DEA usw. Ich muss in der Lage sein, diese Dateien abzurufen und in eine einfache Datenbankstruktur zu übertragen. Der „Speicherort“ wäre der Name des Hauptverzeichnisses und Ordner wie SA_DEA_W sind Unterverzeichnisse innerhalb des übergeordneten Verzeichnisses.
Antwort1
mv *SA_BA_W.out /location/SA_BA_W;
mv *SA_DEA_W.out /location/SA_DEA_W
und so weiter.
Antwort2
Sie können Verzeichnisse einmalig mit dem folgenden Befehl erstellen:
Unterverzeichnisse erstellen
ls *.out | sed -Ee 's/[0-9]*([A-Za-z]+)_([0-9]*[A-Za-z]+[0-9]*)_W.out$/\1_\2_W/g' | awk ' { system("mkdir -p /location/" $0) }'
ODER
find . -regextype awk -regex './([0-9]*[A-Za-z])+_([0-9]*[A-Za-z]+[0-9]*)_W.out' | sed -Ee 's/[0-9]*([A-Za-z]+)_([0-9]*[A-Za-z]+[0-9]*)_W.out$/\1_\2_W/g' | awk '{ system("mkdir -p /location/" $0) }'
ODER
find . -regextype awk -regex './([0-9]*[A-Za-z])+_([0-9]*[A-Za-z]+[0-9]*)_W.out' | sed -Ee 's/[0-9]*([A-Za-z]+)_([0-9]*[A-Za-z]+[0-9]*)_W.out$/\1_\2_W/g' | xargs -I {} mkdir -p /location/{}
Sie können beide Operationen mit der folgenden for-Schleife durchführen
So erstellen Sie Unterverzeichnisse und verschieben die Dateien in die entsprechenden Verzeichnisse:
for i in $(ls *.out)
do
DIR_NAME=$(echo $i | sed -Ee 's/[0-9]*([A-Za-z]+)_([0-9]*[A-Za-z]+[0-9]*)_W.out$/\1_\2_W/g')
test -d /location/$DIR_NAME || mkdir /location/$DIR_NAME
mv $i $DIR_NAME
done
Antwort3
Du könntest es versuchen
find . -iname "*.out" -exec sh -c '
f=${1##*/};
f=${f%.out};
d=./location/$f/;
[ ! -d $f ] && mkdir -p $d;
mv $1 $d' sh {} \;
Vorausgesetzt, Ihre Dateipfade enthalten keine Leerzeichen
Lösungsweg
Finden Sie alle Ihre .out
Dateien und für jede einzelne-exec .... \;
find . -iname "*.out" -exec sh -c '...script...` sh {} \;
Das Konstrukt
sh -c `...script......` sh {}
Nimmt jeden Dateinamen als {}
und übergibt ihn an das Skript zurück, $1
wo wir
Entfernen Sie den Verzeichnispfad bis zum letzten /
und speichern Sie ihn alsf
f=${1##*/};
Entfernen Sie das .out
Suffix
f=${f%.out};
Berechnen Sie das gewünschte Verzeichnis und speichern Sie es alsd
d=./location/$f/;
Erstellen Sie das Verzeichnis, falls es noch nicht existiert, zusammen mit allen übergeordneten Verzeichnissen.-p
[ ! -d $d ] && mkdir -p $d;
Mach den Schritt
mv $1 $d' sh {} \;