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.