GNU/Linux >> Znalost Linux >  >> Linux

Přesouvat soubory čtením jejich názvů souborů do různých adresářů?

Potřebuji přesunout soubory čtením jejich jmen.
Musím přesunout soubory generované systémem a názvy obsahují časové razítko. Potřebuji přesunout soubory čtením názvu souboru podle měsíce.

Pokud název souboru obsahuje 201601*.txt a poté přejděte na 2016/January adresář. Pokud název souboru obsahuje 201602*.txt poté přejděte na 2016/February adresář atd.

Přijatá odpověď:

Pokud jsou řetězce data v názvech souborů a všechny soubory jsou ve stejném adresáři, můžete udělat:

mv 201601*.txt 2016/January

Udělat to 12krát ručně by byla bolest, takže bych vytvořil seznam s číslem a odpovídajícím názvem měsíce:

$ 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

A pak to analyzovat, aby se vytvořil mv příkazy:

$ 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

Jakmile si budete jisti, že to dělá, co potřebujete, odstraňte echo skutečně přesunout soubory:

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

Vysvětlení

The grep -Po 's+K[A-Z]w{2,}') spustí grep s regulárními výrazy kompatibilními s Perl (-P ) a vytiskne pouze odpovídající části každého řádku (-o ). Použitý regulární výraz bude hledat jeden nebo více prázdných znaků (s+ ) následované velkým písmenem ([A-Z] ) a 2 nebo více slovních znaků (w{2,} ). K znamená „ignorovat vše před tímto“, což způsobí, že příkaz vytiskne pouze část odpovídajících řetězců po mezery. Celá věc jednoduše vytiskne seznam měsíců.


Linux
  1. Odebrat všechny soubory/adresáře kromě jednoho souboru?

  2. Makefiles se zdrojovými soubory v různých adresářích

  3. Přesunout soubory do adresářů na základě přípony

  1. Najděte soubory a adresáře v Linuxu pomocí příkazu find

  2. Přesunout soubory v terminálu Linux

  3. Procházení souborů s mezerami v názvech?

  1. Jak přesunout 100 souborů ze složky obsahující tisíce?

  2. Odstraňte soubory a adresáře podle jejich jmen. Žádný takový soubor nebo adresář?

  3. Porovnat adresáře, ale ne obsah souborů?