Renommer les fichiers et les répertoires (ajouter un préfixe)


137

Je voudrais ajouter un préfixe sur tous les dossiers et répertoires.

Exemple:

j'ai

Hi.jpg
1.txt
folder/
this.file_is.here.png
another_folder.ok/

Je souhaite ajouter le préfixe "PRE_"

PRE_Hi.jpg
PRE_1.txt
PRE_folder/
PRE_this.file_is.here.png
PRE_another_folder.ok/

Cordialement,


Utilisez AWK comme sur cette réponse: awk '$ 0 = "prefix" $ 0' file> new_file
Marquez le

Réponses:


224

Merci à Peter van der Heijden , en voici un qui fonctionnera pour les noms de fichiers contenant des espaces:

for f in * ; do mv -- "$f" "PRE_$f" ; done

("-" est nécessaire pour réussir avec des fichiers commençant par des tirets, dont les noms seraient autrement interprétés comme des commutateurs pour la commande mv)


Hé, c'est vrai, cela ne fonctionnera pas du tout si vous avez un fichier avec un espace.
CanSpice

12
Si vous modifiez la lscommande *et mettez des guillemets autour des arguments sur mv, cela fonctionnera pour les fichiers contenant des espaces.
Peter van der Heijden

@CanSpice Est-il possible d'annuler cette opération (supprimer le préfixe) avec un script similaire?
Pascal Qyy

3
Merci mon pote. Le stagiaire ici perdait ses doigts en renommant les 67 fichiers. À votre santé.
Felipe

1
Ce devrait être "mv -" et pas seulement "mv", pour se prémunir contre les fichiers commençant par des tirets, qui autrement seraient interprétés comme des commutateurs de commande. Je contribuerai une modification pour corriger cela.
Jacob C. dit Réintégrer Monica le


61

Pour ajouter un préfixe ou un suffixe pour les fichiers (répertoires), vous pouvez utiliser la méthode simple et puissante de xargs :

ls | xargs -I {} mv {} PRE_{}

ls | xargs -I {} mv {} {}_SUF

Il utilise l'option de remplacement de paramètre de xargs: -I. Et vous pouvez obtenir plus de détails sur la page de manuel.


2
PS: Si vous voulez simplement renommer les fichiersls *.old | xargs -I {} mv {} PRE_{}
partiels

Fait intéressant, l'utilisation de renommer ne fonctionnait pas. utiliser xargs s'est bien passé pour ma configuration RHEL, donc +1 pour cette option, facilite la compréhension de la commande
Acewin

Ne fonctionne pas si le nom de fichier contient un guillemet simple, échoue avec: xargs: guillemet simple sans correspondance; par défaut, les guillemets sont spéciaux pour xargs, sauf si vous utilisez l'option -0
Evgeny Veretennikov

36

Cela pourrait être fait en exécutant une simple findcommande:

find * -maxdepth 0 -exec mv {} PRE_{} \;

La commande ci-dessus fera précéder tous les fichiers et dossiers du répertoire actuel avec PRE_.


8

Pour ajouter un préfixe à tous les fichiers et dossiers dans le répertoire actuel en utilisant util-linux rename(par opposition à prenamela variante perl de Debian et de certains autres systèmes), vous pouvez faire:

rename '' <prefix> *

Cela trouve la première occurrence de la chaîne vide (qui est trouvée immédiatement), puis remplace cette occurrence par votre préfixe, puis colle le reste du nom de fichier jusqu'à la fin. Terminé.

Pour les suffixes , vous devez utiliser la version perl ou utiliser find .


util-linuxsur Debian Stretch semble fournir cela comme /usr/bin/rename.ul.
user1338062

7

Si vous avez Ruby (1.9+)

ruby -e 'Dir["*"].each{|x| File.rename(x,"PRE_"+x) }'

7

avec Perl:

perl -e 'rename $_, "PRE_$_" for <*>'

2

Voici un script simple que vous pouvez utiliser. J'aime utiliser le module non standard File::chdirpour gérer les cdopérations de gestion , donc pour utiliser ce script tel quel, vous devrez l'installer ( sudo cpan File::chdir).

#!/usr/bin/perl

use strict;
use warnings;

use File::Copy;
use File::chdir; # allows cd-ing by use of $CWD, much easier but needs CPAN module

die "Usage: $0 dir prefix" unless (@ARGV >= 2);
my ($dir, $pre) = @ARGV;

opendir(my $dir_handle, $dir) or die "Cannot open directory $dir";
my @files = readdir($dir_handle);
close($dir_handle);

$CWD = $dir; # cd to the directory, needs File::chdir

foreach my $file (@files) {
  next if ($file =~ /^\.+$/); # avoid folders . and ..
  next if ($0 =~ /$file/); # avoid moving this script if it is in the directory

  move($file, $pre . $file) or warn "Cannot rename file $file: $!";
}

1

Sur mon système, je n'ai pas la renamecommande. Voici une simple doublure. Il trouve tous les fichiers HTML de manière récursive et ajoute prefix_devant leurs noms:

for f in $(find . -name '*.html'); do mv "$f" "$(dirname "$f")/prefix_$(basename "$f")"; done

1
avec findvous pouvez également exécuter des commandes, pas besoin de boucle: stackoverflow.com/a/33297439/2351568
DJCrashdummy

0

Cela préfixera vos fichiers dans leur répertoire.

Le ${f%/*}est le chemin jusqu'au dernier slash /-> le répertoire

Le ${f##*/}est le texte sans rien avant la dernière barre oblique /-> nom de fichier sans le chemin

Alors c'est comme ça que ça se passe:

for f in $(find /directory/ -type f); do 
  mv -v $f ${f%/*}/$(date +%Y%m%d)_Prefix_${f##*/}
done
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.