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,

Rafael
la source
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)

CanSpice
la source
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
81

Utilisez le script de changement de nom de cette façon:

$ rename 's/^/PRE_/' *

Il n'y a aucun problème avec les métacaractères ou les espaces dans les noms de fichiers.

tchrist
la source
3
Certains systèmes ont un utilitaire util-linux appelé "rename" qui fonctionne différemment (sur Ubuntu, il s'appelle "rename.ul").
Suspendu jusqu'à nouvel ordre.
renamem'a toujours aidé à gérer très facilement plusieurs fichiers renommés.
Alan Haggai Alavi
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.

Zheng Qsin
la source
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_.

Cyclonecode
la source
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 .

koyae
la source
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) }'
Kurumi
la source
7

avec Perl:

perl -e 'rename $_, "PRE_$_" for <*>'
tadmc
la source
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: $!";
}
Joël Berger
la source
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
conradkleinespel
la source
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
SteinAir
la source