Renommer des fichiers dans le répertoire

10

Comment renommer des fichiers dans un répertoire tel que le fichier suivant:, PMC21375.pdf.txtje dois être renommé en 21375.txt. c'est-à-dire que je dois supprimer les deux PMCet pdfde chaque nom de fichier.

kylejudita
la source

Réponses:

9

Avec « s rename:

rename 's/(PMC|\.pdf)//g' *pdf.txt 

Démo:

$ ls *txt
PMC21375.pdf.txt
$ rename -n 's/(PMC|\.pdf)//g' *txt 
PMC21375.pdf.txt -> 21375.txt

à l' shellinvite. C'est très utile, vous pouvez mettre du code comme je le fais dans une substitution.

Vous pouvez supprimer le -n(commutateur de mode de fonctionnement à sec) lorsque vos tests deviennent valides.

Attention Il existe d'autres outils portant le même nom qui peuvent ou non être en mesure de le faire, alors soyez prudent.

Si vous exécutez la commande suivante ( linux)

$ file $(readlink -f $(type -p rename))

et vous avez un résultat comme

.../rename: Perl script, ASCII text executable

alors cela semble être le bon outil =)

Sinon, pour en faire la valeur par défaut (généralement déjà le cas) sur Debianet dérivé comme Ubuntu:

$ sudo update-alternatives --set rename /path/to/rename

(remplacez /path/to/renamele chemin de votre perl's renamecommande.


Enfin, cet outil a été écrit à l'origine par Larry Wall, le père de Perl.

Gilles Quenot
la source
Cela ne supprimera pas le .pdfdu nom de fichier.
William Everett
Message modifié en conséquence.
Gilles Quenot
5

Outre la commande rename, vous pouvez le faire directement en bash (juste une façon parmi tant d'autres):

 for file in *pdf.txt; do mv $file ${file//[A-Z.]}.txt ; done

Édité pour montrer à Pinyaka comment cela fonctionne:

hmontoliu@ulises2:/tmp/foo$ touch PCM21375.pdf.txt PCM21376.pdf.txt
hmontoliu@ulises2:/tmp/foo$ ls
   PCM21375.pdf.txt  PCM21376.pdf.txt
hmontoliu@ulises2:/tmp/foo$ for file in *pdf.txt; do mv $file ${file//[A-Z.]}.txt ; done
hmontoliu@ulises2:/tmp/foo$ ls
   21375.txt  21376.txt
hmontoliu
la source
Cela ne supprimera pas le .pdfdu nom de fichier.
William Everett
L'as tu essayé? parce que pour moi c'est le cas. Montré dans l'édition.
hmontoliu
Ma faute. Je pensais que cela convertirait simplement des majuscules. A voté.
William Everett
4

Il existe plusieurs utilitaires pour renommer des fichiers, mais l'un des plus faciles à utiliser est rename. Dans votre cas, vous pouvez probablement faire:

rename PMC '' *txt
rename .pdf '' *txt

Le premier paramètre est la partie du nom de fichier à remplacer. Le deuxième paramètre est la chaîne de remplacement. Ici, j'utilise ''pour représenter la chaîne vide. Tous les paramètres suivants sont des fichiers à renommer, ici j'ai utilisé *txtpour limiter le remplacement aux fichiers texte.

renamedevrait déjà être présent si vous utilisez Linux. Si vous utilisez un * BSD ou OS X, vous devrez peut-être d'abord l'installer.

wingedsubmariner
la source
Je ne pense pas qu'il y ait un GNU rename. Il y en a un de util-linuxet un de perlsyntaxe différente. Celui dont vous parlez ressemble à celui de util-linuxqui est parfois appelé rename.ulafin de ne pas être confondu avec le renamefrom perl, tandis que sur certains autres systèmes, renamec'est celui de util-linux et celui de perls'appelle prename.
Stéphane Chazelas
1
Le mien est celui de util-linux. J'ai pensé à tort que cela faisait partie des coreutils GNU.
wingedsubmariner
La version Debian par défaut de renommer serait quelque chose comme ça rename 's/PMC// *.txtetrename s/\.pdf// *.txt
William Everett
1

Faites d'abord une sauvegarde de vos fichiers! Ensuite, fondamentalement, vous pouvez utiliser un one-liner python dans le répertoire courant avec la forme générale:

python -c "import glob,os; [os.rename(fn, fn.replace('PATTERN', 'REPLACE')) for fn in glob.glob('PATH/*')]"

dans votre cas spécifique, vous pouvez l'utiliser deux fois:

python -c "import glob,os; [os.rename(fn, fn.replace('.pdf', '')) for fn in glob.glob('*')]"

pour supprimer .pdfet encore:

python -c "import glob,os; [os.rename(fn, fn.replace('PMC', '')) for fn in glob.glob('*')]"

pour supprimer PMC.

xaratustra
la source
0

Essaye ça:

for i in *.pdf.txt; do j=${i//\.pdf/}; j=${j//PMC/}; mv $i $j; done

Les j=${i//\.pdf/}moyens de se substituer .pdfà $irien. De même avec la deuxième affectation j se débarrasser du PMC.

William Everett
la source
0

Si vous utilisez zsh, c'est un travail typique pour zmv:

zmv 'PMC(*).pdf.txt' '$1.txt'

( zmvgère les conflits potentiels avec élégance).

Stéphane Chazelas
la source