Je dois déplacer des fichiers en lisant leurs noms.
Je dois déplacer des fichiers générés par le système et les noms incluent un horodatage. Je dois déplacer les fichiers en lisant le nom du fichier par mois.
Si le nom du fichier contient 201601*.txt
, puis passez à 2016/January
annuaire. Si le nom du fichier contient 201602*.txt
puis passez à 2016/February
répertoire etc.
Réponse acceptée :
Eh bien, si les chaînes de date sont dans les noms de fichiers et que tous les fichiers sont dans le même répertoire, vous pouvez faire :
mv 201601*.txt 2016/January
Faire cela 12 fois manuellement serait pénible, donc je créerais une liste avec le numéro et le nom du mois correspondant :
$ 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
Et puis analysez-le pour construire le mv
commandes :
$ 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
Une fois que vous êtes sûr que cela fait ce dont vous avez besoin, supprimez le echo
pour déplacer réellement les fichiers :
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
Explication
Le grep -Po 's+K[A-Z]w{2,}')
lancera grep
avec les expressions régulières compatibles Perl (-P
) et n'imprimera que la ou les parties correspondantes de chaque ligne (-o
). L'expression régulière utilisée recherchera un ou plusieurs caractères blancs (s+
) suivi d'une majuscule ([A-Z]
) et 2 caractères de mot ou plus (w{2,}
). Le K
signifie "tout ignorer avant cela", ce qui entraînera la commande à n'imprimer que la partie des chaînes correspondantes après l'espace blanc. Le tout imprime simplement la liste des mois.