GNU/Linux >> Linux Esercitazione >  >> Linux

Spostare i file leggendo i loro nomi di file in directory diverse?

Devo spostare i file leggendone i nomi.
Devo spostare i file generati dal sistema ei nomi includono un timestamp. Devo spostare i file leggendo il nome del file per mese.

Se il nome del file contiene 201601*.txt , quindi passa a 2016/January directory. Se il nome del file contiene 201602*.txt quindi passa a 2016/February directory ecc.

Risposta accettata:

Bene, se le stringhe di data sono nei nomi dei file e tutti i file sono nella stessa directory, potresti fare:

mv 201601*.txt 2016/January

Farlo 12 volte manualmente sarebbe una seccatura, quindi creerei un elenco con il numero e il nome del mese corrispondente:

$ 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

E poi analizzalo per creare il mv comandi:

$ 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

Una volta che sei sicuro che fa ciò di cui hai bisogno, rimuovi echo per spostare effettivamente i file:

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

Spiegazione

Il grep -Po 's+K[A-Z]w{2,}') eseguirà grep con espressioni regolari compatibili con Perl (-P ) e stamperà solo la parte o le parti corrispondenti di ciascuna riga (-o ). L'espressione regolare utilizzata cercherà uno o più spazi bianchi (s+ ) seguito da una lettera maiuscola ([A-Z] ) e 2 o più caratteri alfanumerici (w{2,} ). Il K significa "ignora tutto prima di questo" che farà sì che il comando stampi solo la parte delle stringhe corrispondenti dopo lo spazio bianco. Il tutto stampa semplicemente l'elenco dei mesi.


Linux
  1. Sposta i file nel terminale Linux

  2. Un modo semplice per nascondere file e directory in Linux

  3. Come spostare 100 file da una cartella che ne contiene migliaia?

  4. Elimina file e directory in base ai loro nomi. Nessun file o directory con questo nome?

  5. Confronta le directory ma non il contenuto dei file?

Comando Ls in Linux (Elenca file e directory)

Come copiare file e directory in Linux

Come spostare file e directory in Linux (comando mv)

Come copiare file e directory nel terminale Linux

Comando Stat:Visualizza gli attributi di file e directory

Lettura di file Rdata con codifica diversa