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ů.