2017-02-19 3 views
1

J'ai fait une grosse erreur aujourd'hui en gérant mon système de sauvegarde auto-hébergé et j'ai fini par supprimer environ la moitié de mon dossier utilisateur. Heureusement, la sauvegarde existait et était capable de copier toutes mes données. La partie mauvaise est chaque fichier qui a été restauré a un horodatage dans le nom de fichier.Batch ou Bash pour supprimer un horodatage en milliers de fichiers

Ainsi, un fichier qui était filename.file est maintenant le nom de fichier ~ 20170401-1999.file

Je ne suis pas trop lumineux quand il s'agit de fichiers batch ou ce pas, mais est-il possible un BAT pourrait être programmé pour parcourir chaque nom de fichier et supprimer l'horodatage? Chaque horodatage commence par ~ et se termine par la période du type de fichier. Donc enlever tout ce qui inclut et après le tilde et s'arrêter au personnage avant la période réglerait le problème.

4600 fichiers ont besoin d'être corrigés avec une grande variété d'extensions de type de fichier. Je suis sur Windows 10 Pro et capable d'user powershell ou bash pour corriger l'erreur. J'ai le sous-système Windows Linux installé, donc un script bash est également acceptable.

+0

Existe-t-il toujours exactement un '~' dans chaque nom de fichier? – aschipfl

+0

Vous avez déjà une réponse, mais oui, il est apparu exactement une fois dans chaque fichier qui a été restauré à partir de la sauvegarde. Les fichiers non restaurés étaient simplement nom_fichier.type alors que les fichiers de restauration étaient nom_fichier ~ groupe_date_date_temps.type (I.E. resume ~ 20170409-173314.pdf –

+0

Cela aurait facilement pu se faire avec n'importe quel utilitaire de renommage de fichiers disponible gratuitement sur Internet. – Squashman

Répondre

1

PowerShell propose une solution simple:

Get-ChildItem -Recurse -File -Filter *~* | 
    Rename-Item -NewName { $_.Name -replace '~[^.]+' } -WhatIf 
  • -WhatIfaperçus les opérations de changement de nom; retirez-le, une fois que vous avez confirmé que la commande fonctionnera comme prévu. Par souci de simplicité, j'ai fait l'hypothèse que tout nom de fichier contenant ~ doit être renommé; la mise en correspondance peut être affinée, si les faux positifs doivent être éliminés:
    Get-ChildItem -Recurse -File *~[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]-[0-9][0-9][0-9][0-9].*

  • La correspondance est limitée à fichiers (-File), situés partout dans la sous-arborescence de répertoire courant (-Recurse).
    Pour ne faire correspondre que les fichiers situés directement dans le répertoire en cours, supprimez -Recurse.

  • Le bloc de script ({ ... }) passée au paramètre de cmdlet Rename-Item-NewName calcule le nouveau nom de fichier:

    • $_.Name renvoie le nom du fichier d'entrée ($_ est variable automatique de PowerShell pour représenter l'objet d'entrée à la main).
    • -replace '~[^.]+' effectue un remplacement de chaîne à base de regex-: '~[^.]+' correspond à une ~ suivie par une séquence non vide (+) des caractères autres que . ([^.]) .; ne pas spécifier une chaîne de remplacement utilise implicitement la chaîne vide, de sorte que la partie correspondante est effectivement supprimée du nom.
0

Juste une idée du haut de ma tête.

Vous pouvez parcourir les fichiers, et pour chaque nom de fichier, vous pouvez remplacer la sous-chaîne qui correspondent à l'expression rationnelle /~\d+-\d+/ avec "" (à savoir, chaîne vide) et utiliser la chaîne modifiée comme nouveau nom du fichier.

0
@ECHO OFF 
SETLOCAL 

SET "sourcedir=U:\sourcedir" 
FOR /f "delims=" %%a IN (
'dir /b /s /a-d "%sourcedir%\*" ' 
) DO (
FOR /f "tokens=1,2delims=~" %%p IN ("%%~na") DO (
    IF "%%q" neq "" ECHO(REN "%%a" "%%~p%%~xa" 
) 
) 

GOTO :EOF 

Vous devrez modifier le réglage de sourcedir en fonction de votre situation.

Les commandes REN requises sont simplement ECHO éditées à des fins de test. Après avoir vérifié que les commandes sont correctes, remplacez ECHO(REN par REN pour renommer les fichiers.

Effectuer une analyse de répertoire avec des sous-répertoires sous la forme de base avec les noms de directeurs et attribuer à %%a. Ensuite, marquez le nom du nom complet trouvé dans %%p et %%q en utilisant ~ en tant que délimiteur. Si le second jeton n'est pas vide, alors nous avons un horodatage dans %%q forment ainsi le nouveau nom de la partie dans %%p et l'extension de %%a

0

variation de mklement0 sans regex

Get-ChildItem -Recurse -File -Filter *~*.file | 
    rename-item -NewName {"{0}{1}" -f ($_.BaseName -split "~")[0], $_.Extension } -WhatIf 

une version courte:

gci -Rec -File -Filter *~*.file | ren -n {"{0}{1}" -f ($_.Base -split "~")[0], $_.Extension } -WhatIf