6
votes

Comment puis-je facilement voler des fichiers de renommer avec Perl?

J'ai beaucoup de fichiers que j'essaie de renommer, j'ai essayé de faire une expression régulière pour les associer, mais même que je suis restée bloquée sur les fichiers sont nommés comme:

Nom du fichier 01

Nom du fichier 100

nom de fichier 02

nom de fichier 03

etc, je voudrais ajouter un "0" (zéro), derrière n'importe quel fichier inférieur à 100, comme celui-ci:

Nom du fichier 001

Nom du fichier 100

Nom du fichier 002

Nom de fichier 003

Le plus proche que je dois tellement pour les assortir était d'utiliser cette trouvaille de la ville d | TRY -R | Grep '[1-9] [0-9] $' Cependant, je ne pouvais pas comprendre comment les remplacer. Merci d'avance pour toute aide que vous pouvez m'offrir. Je suis sur Centos si cela est de toute aide, tout cela se fait via SSH.


8 commentaires

Est-ce que vos noms de fichiers contiennent des espaces?


Oui, ils ressemblent à: "Nom du fichier 01" "Nom du fichier 101"


Pouvez-vous élaborer sur les "outils" disponibles sur la machine? Avez-vous Perl, python, rubis ou similaire installé?


Pourriez-vous clarifier quels sont les noms des fichiers que vous essayez de correspondre sont et quels sont les noms que vous essayez d'éviter de faire correspondre? Je suis un peu confus ici.


Perl (5.8.8) est sur la machine, cependant Python et Ruby ne le sont pas, je suis assez familier pour passer à travers Yum et les installer si nécessaire.


mpobrien; im essayant de faire correspondre des fichiers nommés comme: "Nom du dossier 12" "Nom du dossier 120" Il y a 2 mots dans les noms que les noms sont tous identiques, ses numéros sont différents, en bref, je veux ajouter un zéro avant tout numéro Sous moins de 100, je tente de transformer le "nom du fichier 10" en "nom de fichier 010", laissez-moi savoir si cela est un peu plus clair. Désolé pour toute confusion


Exécutez-vous un programme localement qui doit renommer des fichiers sur un système distant via SSH? Ou pouvez-vous installer et exécuter un programme sur le système cible?


DaoToad, son être fait à distance via SSH. Je peux installer des choses sur le système cible.


9 Réponses :


0
votes

Je pense MMV est votre ami ici.


0 commentaires

10
votes
find . -type d -print0 | xargs -0 rename 's/(\d+)/sprintf "%03d", $1/e' 
or something like that, provided
You have GNU find and GNU xargs (for -print0 and -0)
You have the 'rename' utility that comes with perl
There's only one group of digits in the filename. If there's more than one, then you need to do something with the regex to make it only match the number you want to reformat.

4 commentaires

C'est proche de quelque chose que j'allais suggérer, en utilisant SED au lieu de Xargs, alors je vais +1.


Je savais que Xargs était la voie à suivre, je ne pouvais tout simplement pas écrire la commande exacte.


+1 Pour la liste des dépendances (il s'agit éventuellement de l'utilitaire de renommée que vous référez-vous à une miam ou d'apt-gover).


J'ai toujours été énervé que le Cygwin Perl Distro n'inclut pas Renommer.



2
votes

Exécutez deux commandes, dans cette commande: xxx

première renomme tout moins de 10 ans et réduit un zéro. Le second renomme tout moins de 100 ans et répeint un zéro. Le résultat doit être trois chiffres pour tous les noms de fichiers.


1 commentaires

Renommer est un utilitaire fourni avec la distribution Perl standard. J'ai couru ces sous Linux Bash.



0
votes

Vous pouvez faire quelque chose à utiliser perl ou ruby.

mettre tous ces fichiers dans le même répertoire xxx


2 commentaires

Vous devriez probablement mentionner que ce code est rubis et non perl


Et c'est pourquoi j'ai dit que vous devriez désamorquer le fait que le code est rubis.



4
votes

Est-ce une chose une fois? Si oui, je vais suggérer quelque chose qui pourrait sembler être un flic par de nombreux programmeurs ici:

tuyau de sortie de votre commande ( Rechercher -Type D | Trier -r | grep '[1-9] [0-9] $' ) dans un fichier et utilisez un éditeur avec Quelques recherches globales / remplacez la magie pour créer un script qui fait la renommée.

Puis jeter le script.

Il y a peu de bruit et peu de chances que vous vous retrouviez sur vous-même au pied en essayant de tenter d'une doublure oncle intelligente (mais inadéquatement débiguré), descendez dans les mauvaises herbes sur vos fichiers.


5 commentaires

++! Parfois, il vaut mieux utiliser un kludge que vous comprenez que d'apprendre «la magie profonde».


+1 Je pense que ce genre de chose est souvent la solution la plus pragmatique pour les exigences d'une éveil


C'est peut-être un flic-out, mais c'est un coffre-fort sûr ... Kudos.


Une recherche globale possible et remplacer la magie dans Vim pour cela est : s / ^ \ (. * \) \ (\ D \ d \) $ / mv \ 1 \ 10 \ 2 /


Dans EMACS, vous pouvez ouvrir une liste de répertoires, appuyez sur C-X C-Q, modifiez les noms de fichiers dans la mémoire tampon (par exemple avec recherche et remplacement, ou une autre commande), et lors de la sauvegarde EMACS renommera les fichiers.



13
votes
perl -e 'foreach $f (glob("File\\ Name*")) { $nf = $f; $nf =~ s/(\d+)$/sprintf("%03d",$1)/e; print `mv \"$f\" \"$nf\"`;}'
A bit overkill maybe, but it does what is asked.

0 commentaires

0
votes
use strict;
use File::Copy;

my @files = glob 'File*Name*';

foreach my $filename (@files) {
    if ($filename =~ m`^.*File.*Name.*?(\d+)`) {
        my $number = $1;
        next if ($number > 99);
        rename $filename, sprintf("FileName%03d",$number);
    }
}

2 commentaires

Ce nom renommé Nom de fichier 100 à nom de fichier 0100 qui n'est pas destiné.


Vous étiez certainement bien. Ajout du code pour le faire pour que cela ne se produise pas.



1
votes

Dans mon Debian, il fonctionne bien avec Renommer, testé avec 300 fichiers.

 perl -e 'map `touch door$_.txt`, 1..300;'
 rename 's/(\d+)\.txt/sprintf("%03d.txt", $1)/e' *.txt


0 commentaires

0
votes

Si votre télécommande a une coque Bash xxx

supprimer "écho" pour faire un renommage réel


0 commentaires