Dateien und Verzeichnisse umbenennen (Präfix hinzufügen)

137

Ich möchte allen Ordnern und Verzeichnissen ein Präfix hinzufügen.

Beispiel:

ich habe

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

Ich möchte das Präfix "PRE_" hinzufügen.

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

Grüße,

Rafael
quelle
Verwenden AWK als auf diese Antwort: awk '0 $ = "Präfix" $ 0' Datei> new_file
Mark

Antworten:

224

Dank Peter van der Heijden ist hier einer, der für Dateinamen mit Leerzeichen funktioniert:

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

("-" wird benötigt, um mit Dateien erfolgreich zu sein, die mit Bindestrichen beginnen, deren Namen sonst als Schalter für den Befehl mv interpretiert würden.)

CanSpice
quelle
Heh, stimmt, das funktioniert überhaupt nicht, wenn Sie eine Datei mit einem Leerzeichen haben.
CanSpice
12
Wenn Sie den lsBefehl in ändern *und die Argumente in doppelte Anführungszeichen setzen mv, funktioniert dies für Dateien, die Leerzeichen enthalten.
Peter van der Heijden
@CanSpice Ist es möglich, diesen Vorgang mit einem ähnlichen Skript umzukehren (das Präfix entfernen)?
Pascal Qyy
3
Danke, Kumpel. Der Praktikant hier verlor seine Fingerkappen und benannte alle 67 Dateien um. Prost.
Felipe
1
Es sollte "mv -" sein, nicht nur "mv", um sich vor Dateien zu schützen, die mit Bindestrichen beginnen und ansonsten als Befehlsschalter interpretiert würden. Ich werde eine Bearbeitung beisteuern, um dies zu korrigieren.
Jacob C. sagt Reinstate Monica
81

Verwenden Sie die Umbenennungs Skript auf diese Weise:

$ rename 's/^/PRE_/' *

Es gibt keine Probleme mit Metazeichen oder Leerzeichen in Dateinamen.

tchrist
quelle
3
Einige Systeme haben ein Util-Linux-Dienstprogramm namens "Rename", das anders funktioniert (unter Ubuntu heißt es "Rename.ul").
Bis auf weiteres angehalten.
renamehat mir immer geholfen, mit dem Umbenennen mehrerer Dateien sehr einfach umzugehen.
Alan Haggai Alavi
61

Zum Hinzufügen von Präfixen oder Suffixen für Dateien (Verzeichnisse) können Sie die einfache und leistungsstarke Methode von xargs verwenden :

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

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

Es wird die Paramerter-Ersetzungsoption von xargs verwendet: -I. Weitere Informationen finden Sie auf der Manpage.

Zheng Qsin
quelle
2
PS: Wenn Sie nur ls *.old | xargs -I {} mv {} PRE_{}
Teiledateien
Interessanterweise hat die Umbenennung nicht funktioniert. Die Verwendung von xargs ging für mein RHEL-Setup gut, daher macht es +1 für diese Option einfach, den Befehl zu verstehen
Acewin
Funktioniert nicht, wenn der Dateiname ein einfaches Anführungszeichen enthält, schlägt fehl mit: xargs: nicht übereinstimmendes einfaches Anführungszeichen; Standardmäßig sind Anführungszeichen speziell für Xargs, es sei denn, Sie verwenden die Option -0
Evgeny Veretennikov
36

Dies könnte durch Ausführen eines einfachen findBefehls erfolgen:

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

Mit dem obigen Befehl werden allen Dateien und Ordnern im aktuellen Verzeichnis Folgendes vorangestellt PRE_.

Cyclonecode
quelle
8

Um allen Dateien und Ordnern im aktuellen Verzeichnis mit util-linux ein Präfix hinzuzufügen rename(im Gegensatz zur prenamePerl-Variante von Debian und bestimmten anderen Systemen), haben Sie folgende Möglichkeiten :

rename '' <prefix> *

Dadurch wird das erste Vorkommen der leeren Zeichenfolge gefunden (die sofort gefunden wird) und dieses Vorkommen durch Ihr Präfix ersetzt. Anschließend wird der Rest des Dateinamens bis zum Ende aufgeklebt. Getan.

Für Suffixe müssen Sie die Perl-Version oder find verwenden .

Koyae
quelle
util-linuxauf Debian Stretch scheint dies als zu liefern /usr/bin/rename.ul.
user1338062
7

Wenn Sie Ruby haben (1.9+)

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

mit Perl:

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

Hier ist ein einfaches Skript, das Sie verwenden können. Ich verwende gerne das nicht standardmäßige Modul File::chdir, um cdVorgänge zu verwalten. Um dieses Skript unverändert zu verwenden, müssen Sie es installieren ( 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: $!";
}
Joel Berger
quelle
1

Auf meinem System habe ich den renameBefehl nicht. Hier ist ein einfacher Einzeiler. Es findet alle HTML-Dateien rekursiv und fügt prefix_vor ihren Namen hinzu:

for f in $(find . -name '*.html'); do mv "$f" "$(dirname "$f")/prefix_$(basename "$f")"; done
Conradkleinespel
quelle
1
mit findSie können auch Befehle, keine Notwendigkeit für eine Schleife ausführen: stackoverflow.com/a/33297439/2351568
DJCrashdummy
0

Dadurch werden Ihre Dateien in ihrem Verzeichnis vorangestellt.

Das ${f%/*}ist der Pfad bis zum letzten Schrägstrich /-> das Verzeichnis

Das ${f##*/}ist der Text ohne irgendetwas vor dem letzten Schrägstrich /-> Dateiname ohne den Pfad

So geht es also:

for f in $(find /directory/ -type f); do 
  mv -v $f ${f%/*}/$(date +%Y%m%d)_Prefix_${f##*/}
done
SteinAir
quelle