2017-12-06 1 views
-2

Ich möchte das spezifische Format der Datei unter der Liste der Dateien in einem Verzeichnis auswählen. Finden Sie das folgende Beispiel.Wählen Sie die spezifische Datei im Ordner

Ich habe eine untere Liste von Dateien (6 Dateien).

Set-1
1) MAG_L_NT_AA_SUM_2017_01_20.dat
2) MAG_L_NT_AA_2017_01_20.dat

Set-2
1) MAG_L_NT_BB_SUM_2017_01_20.dat
2) MAG_L_NT_BB_2017_01_20.dat

Set-3
1) MAG_L_NT_CC_SUM_2017_01_20.dat
2) MAG_L_NT_CC_2017_01_20.dat

Von den oben genannten drei Sets brauche ich nur 3 Dateien.
1) MAG_L_NT_AA_2017_01_20.dat
2) MAG_L_NT_BB_2017_01_20.dat
3) MAG_L_NT_CC_2017_01_20.dat

Hinweis: Es können mehrere Zeilen von Befehlen sein, weil ich das Skript req für oben zu schaffen haben. Dank

Antwort

0

Wahrscheinlich einfachste und am wenigsten komplexe Lösung für Ihr Problem find (ein Werkzeug für die Suche nach Dateien in einer Verzeichnishierarchie) und grep (Tool zum Drucken von Linien, die mit einem Muster Übereinstimmen) ist die Kombination. Sie können diese Handbücher auch lesen, indem Sie man find und man grep eingeben.

Bevor wir direkt zur Lösung gehen, müssen wir verstehen, wie wir Ihr Problem angehen werden. Um Muster in einem Namen Datei, die wir suchen, werden wir find Befehl mit der Option verwenden -name:

-nameMuster

Basis von Dateinamen (der Pfad mit den führenden Verzeichnissen entfernt) Spiele Muschelmuster Muster. Die Metazeichen ('*', '?' Und '[]') entsprechen einem '.' am Anfang des Basisnamens (dies ist eine Änderung in findutils-4.2.2; siehe Abschnitt STANDARDS KONFORMITÄT unten). Um ein Verzeichnis und die darunter liegenden Dateien zu ignorieren, verwenden Sie -prune; Ein Beispiel finden Sie in der Beschreibung von -path. Klammern werden nicht als speziell erkannt, trotz der Tatsache, dass einige Shells inklusive Bash Klammern mit einer speziellen Bedeutung in Shell-Muster verleihen. Der Dateinamensvergleich wird unter Verwendung der Bibliotheksfunktion fnmatch (3) durchgeführt. Vergessen Sie nicht, das Muster in Anführungszeichen einzuschließen, um es vor der Erweiterung durch die Shell zu schützen.

Zum Beispiel, wenn wir für eine Datei enthält String ‚abc‘ im Verzeichnis 'words_directory' genannt gesucht werden soll, wird gehen wir folgendes:

$ find words_directory -name "*abc*" 

Und wenn wir alle Verzeichnisse im Verzeichnis suchen möchten:

$ find words_directory/* -name "*abc*" 

Also zuerst, müssen wir alle Dateien finden, die mit "MAG_L_NT_" Zeichenfolge beginnen und enden mit ".dat", also alle passenden Namen in /your/specified/path/ finden, die viele Unterverzeichnisse enthält, die Dateien, die diesem Muster entsprechen, enthalten könnte:

$ find /your/specified/path/* -name "MAG_L_NT_*.dat" 

Doch diese druckt alle gefundenen Dateinamen, aber wir haben noch Namen bekommen enthalten "SUM" Zeichenfolge, da kommt in Grep. Um Namen enthält unerwünschten Zeichenfolge schließen wir Option verwenden -v:

-v, --invert-Spiel

Invert das Gefühl des Matching, wählen nicht passenden Linien. (-V wird von POSIX angegeben.)

grep zuerst verwenden, um herauszufiltern Befehle Ausgang verwenden wir () |:

Die Standard-Shell-Syntax für Rohrleitungen ist es, mehrere Befehle aufzulisten , getrennt durch vertikale Balken ("Rohre" in gemeinsamen Unix Wortschatz). Für Beispiel, um Dateien im aktuellen Verzeichnis (ls) aufzulisten, behalten nur die Zeilen von ls Ausgabe mit der Zeichenfolge "Schlüssel" (grep), und zeigen Sie das Ergebnis in einer Scroll-Seite (weniger), ein Benutzer tippt die in die folgenden Befehlszeile eines Terminals:

ls -l | grep key | less 

„ls -l“ erzeugt einen Prozess, der Ausgang (stdout) davon zu verrohrt wird der Eingang (stdin) des Verfahrens für „grep key“ ; und ebenfalls für den Prozess für "weniger". Jeder Prozess nimmt eine Eingabe von dem vorherigen Prozess und erzeugt eine Ausgabe für den nächsten Prozess über Standardströme. Jeder "|" fordert die Shell auf, die Standardausgabe des Befehls links an den Standardeingang des Befehls rechts über einen Interprozess-Kommunikationsmechanismus zu verbinden, der als (anonyme) Pipe im Betriebssystem implementiert ist. Rohre sind unidirektional; Daten fließt durch die Pipeline von links nach rechts.

process1 | process2 | process3 

Nachdem Sie erwähnten Befehle und Optionen kennengelernt, die verwendet wird, um Ihr Ziel zu erreichen, sind Sie für die Lösung bereit:

$ find /your/specified/path/* -name "MAG_L_NT_*.dat" | grep -v "SUM" 

Dieser Befehl Ausgabe aller Namen produzieren, die beginnen "MAG_L_NT_" und enden mit ".dat".grep -v verwendet die erste Befehlsausgabe als Eingabe und entfernt alle Zeilen, die enthalten.

+0

Es funktioniert gut danke .... – sudheer113

+0

@ sudheer113, wenn ich Ihre Frage beantwortet, sollten Sie [markieren Sie meine Antwort als richtig] (https://stackoverflow.com/help/someone-answers), auch Kommentarabschnitt ist gewidmet um über das Problem zu sprechen, nicht um Antworten zu danken (Sie können durch Upvoting danken). Lesen Sie mehr über allgemeine Regeln [https://stackoverflow.com/help/asking]. – Lycopersicum

Verwandte Themen