Aussortieren von Dateien in verschiedene Verzeichnisse für ein Hauptverzeichnis

Aussortieren von Dateien in verschiedene Verzeichnisse für ein Hauptverzeichnis

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 .outDateien 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, $1wo wir

Entfernen Sie den Verzeichnispfad bis zum letzten /und speichern Sie ihn alsf

         f=${1##*/};

Entfernen Sie das .outSuffix

         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 {} \;

verwandte Informationen