2010-04-19 6 views
4

Comment puis-je remplacer le même texte dans les noms de dossier sous Linux? Disons que j'ai "Photos_Jun", "Photos_July", "Photos_Aug", etc. Quoi de plus simple que je puisse les renommer comme "Photos Jun", "Photos Juillet", etc (fondamentalement, je veux remplacer le trait de soulignement par un espace « » J'ai environ 200 de ces dossiersRemplacer le texte dans les noms de dossier

que je cherchais à la solution:.. How can I easily bulk rename files with Perl?

Il ressemble à ce que je cherche cependant, je ne sais pas comment faire une expression régulière pour correspondre les dossiers sont alphanumériques suivi d'un "_".

Tous les fichiers ont des noms non numériques, donc je pense que [a-zA-Z] est le bon moyen de Tarte.

perl -e 'foreach $f (glob("File\\ Name*")) { $nf = $f; $nf =~ s/(\d+)$/sprintf("%03d",$1)/e; print `mv \"$f\" \"$nf\"`;}' 

Merci pour toute aide!

+0

Merci à tous qui ont répondu, la solution non-perl fonctionne le mieux pour moi. J'avais quelques tirets à enlever, et ça marchait bien aussi quand j'ai remplacé le _ par -. – dannyb

Répondre

2

si vous êtes sur * nix et ne vous dérange pas une solution non Perl, voici une solution shell (bash). retirez le echo lorsque vous êtes satisfait.

#!/bin/bash 
shopt -s extglob 
for file in +([a-zA-Z])*_+([a-zA-Z])/; do echo mv "$file" "${file//_/ }"; done 
+0

cela a fonctionné, j'ai dû enlever "echo" pour que cela fonctionne, merci! – dannyb

+0

petit amendement. Si vous voulez seulement des dossiers, mettez une barre oblique derrière. voir modifier. – ghostdog74

0
perl -e 'use File::Copy; foreach my $f (glob("*")) { next unless -d $f; my $nf = $f; $nf =~ s/_/ /g; move($f, $nf) || die "Can not move $f to $nf\n"; } 

Tu Déroulez le one-liner:

use strict; # Always do that in Perl. Keeps typoes away. 
use File::Copy; # Always use native Perl libraries instead of system calls like `mv` 
foreach my $f (glob("*")) { 
    next unless -d $f; # Skip non-folders 
    next unless $f =~ /^[a-z_ ]+$/i; # Reject names that aren't "a-zA-Z", _ or space 
    my $new_f = $f; 
    $new_f =~ s/_/ /g; # Replace underscore with space everywhere in string 
    move($f, $nf) || die "Can not move $f to $nf: $!\n"; 
        # Always check return value from move, report error 
} 
3

Linux a une commande rename:

rename '-' ' ' Photos_* 
Questions connexes