GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Dateien durch Lesen ihrer Dateinamen in verschiedene Verzeichnisse verschieben?

Ich muss Dateien verschieben, indem ich ihre Namen lese.
Ich muss vom System generierte Dateien verschieben und die Namen enthalten einen Zeitstempel. Ich muss die Dateien verschieben, indem ich den Dateinamen nach Monat lese.

Wenn der Dateiname 201601*.txt enthält , und wechseln Sie dann zu 2016/January Verzeichnis. Wenn der Dateiname 201602*.txt enthält Wechseln Sie dann zu 2016/February Verzeichnis etc.

Akzeptierte Antwort:

Nun, wenn die Datumszeichenfolgen in den Dateinamen enthalten sind und sich alle Dateien im selben Verzeichnis befinden, könnten Sie Folgendes tun:

mv 201601*.txt 2016/January

Dies 12 Mal manuell zu tun, wäre mühsam, also würde ich eine Liste mit der Nummer und dem entsprechenden Monatsnamen erstellen:

$ paste <(printf '%sn' {01..12}) <(cal 2016 | grep -Po 's+K[A-Z]w{2,}') 
01  January
02  February
03  March
04  April
05  May
06  June
07  July
08  August
09  September
10  October
11  November
12  December

Und parsen Sie es dann, um das mv zu erstellen Befehle:

$ paste <(printf '%sn' {01..12}) <(cal 2016 | grep -Po 's+K[A-Z]w{2,}') | 
    while read num month; do echo mv "*2016$num*" 2016/"$month"; done
mv *201601* 2016/January
mv *201602* 2016/February
mv *201603* 2016/March
mv *201604* 2016/April
mv *201605* 2016/May
mv *201606* 2016/June
mv *201607* 2016/July
mv *201608* 2016/August
mv *201609* 2016/September
mv *201610* 2016/October
mv *201611* 2016/November
mv *201612* 2016/December

Wenn Sie sicher sind, dass dies Ihren Anforderungen entspricht, entfernen Sie das echo um die Dateien tatsächlich zu verschieben:

paste <(printf '%sn' {01..12}) <(cal 2016 | grep -Po 's+K[A-Z]w{2,}') | 
    while read num month; do echo mv "*2016$num*" 2016/"$month"; done

Erklärung

Das grep -Po 's+K[A-Z]w{2,}') wird grep ausführen mit Perl-kompatiblen regulären Ausdrücken (-P ) und druckt nur die übereinstimmenden Teile jeder Zeile (-o ). Der verwendete reguläre Ausdruck sucht nach einem oder mehreren Leerzeichen (s+ ) gefolgt von einem Großbuchstaben ([A-Z] ) und 2 oder mehr Wortzeichen (w{2,} ). Das K bedeutet „alles davor ignorieren“, was dazu führt, dass der Befehl nur den Teil der übereinstimmenden Zeichenfolgen nach ausgibt das Leerzeichen. Das Ganze druckt einfach die Liste der Monate.


Linux
  1. Finden Sie Dateien und Verzeichnisse unter Linux mit dem Befehl find

  2. Verschieben Sie Dateien im Linux-Terminal

  3. Makefiles mit Quelldateien in verschiedenen Verzeichnissen

  4. Warum können Dateien nicht von Inode manipuliert werden?

  5. Verschieben Sie Dateien basierend auf der Erweiterung in Verzeichnisse

Ls-Befehl in Linux (Dateien und Verzeichnisse auflisten)

So kopieren Sie Dateien und Verzeichnisse unter Linux

So verschieben Sie Dateien und Verzeichnisse in Linux (mv-Befehl)

So kopieren Sie Dateien und Verzeichnisse im Linux-Terminal

Stat-Befehl:Attribute von Dateien und Verzeichnissen anzeigen

Lesen von Rdata-Dateien mit unterschiedlicher Kodierung