Rinomina file e directory (Aggiungi prefisso)


137

Vorrei aggiungere il prefisso su tutte le cartelle e directory.

Esempio:

io ho

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

Vorrei aggiungere il prefisso "PRE_"

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

Saluti,


Usa AWK come per questa risposta: awk '$ 0 = "prefisso" $ 0' file> new_file
Segna il

Risposte:


224

Grazie a Peter van der Heijden , eccone uno che funzionerà con nomi di file con spazi:

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

("-" è necessario per avere successo con i file che iniziano con trattini, i cui nomi verrebbero altrimenti interpretati come opzioni per il comando mv)


Heh, vero, questo non funzionerà completamente se hai un file con uno spazio al suo interno.
CanSpice,

12
Se si modifica il lscomando in *e si inseriscono doppie virgolette attorno agli argomenti mv, funzionerà per i file contenenti spazi.
Peter van der Heijden,

@CanSpice È possibile invertire questa operazione (rimuovere il prefisso) con uno script simile?
Pascal Qyy

3
Grazie compagno. Qui il tirocinante stava perdendo i tappi per le dita rinominando tutti i 67 file. Saluti.
Felipe,

1
Dovrebbe essere "mv -" non solo "mv", per evitare file che iniziano con trattini, che altrimenti verrebbero interpretati come opzioni di comando. Contribuirò a una modifica per correggere questo.
Jacob C. dice di reintegrare Monica il


61

Per aggiungere prefisso o suffisso per i file (directory), è possibile utilizzare il modo semplice e potente di xargs :

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

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

Sta usando l'opzione di sostituzione dei parametri di xargs: -I. E puoi ottenere maggiori dettagli dalla pagina man.


2
PS: Se vuoi solo rinominare i file di parti (directory) della directory corrente, basta filtrarli prima di xargs, come ad esempio:ls *.old | xargs -I {} mv {} PRE_{}
Zheng Qsin

è interessante notare che l'utilizzo di rinomina non ha funzionato. l'uso di xargs è andato bene per la mia configurazione RHEL, quindi +1 per questa opzione, rende facile capire il comando
Acewin

Non funziona se il nome file contiene virgolette singole, non riesce con: xargs: virgoletta singola senza eguali; per impostazione predefinita le virgolette sono speciali per xargs a meno che non si usi l'opzione -0
Evgeny Veretennikov

36

Questo potrebbe essere fatto eseguendo un semplice findcomando:

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

Il comando precedente prefigura tutti i file e le cartelle nella directory corrente con PRE_.


8

Per aggiungere un prefisso a tutti i file e le cartelle nella directory corrente usando util-linux rename(al contrario di prename, la variante perl di Debian e alcuni altri sistemi), puoi fare:

rename '' <prefix> *

Questo trova la prima occorrenza della stringa vuota (che si trova immediatamente) e quindi sostituisce quell'occorrenza con il prefisso, quindi incolla il resto del nome del file alla fine. Fatto.

Per i suffissi , è necessario utilizzare la versione perl o utilizzare trova .


util-linuxsu Debian Stretch sembra fornire questo come /usr/bin/rename.ul.
user1338062,

7

Se hai Ruby (1.9+)

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

7

con Perl:

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

2

Ecco un semplice script che puoi usare. Mi piace usare il modulo non standard File::chdirper gestire le cdoperazioni di gestione , quindi per usare questo script così com'è è necessario installarlo ( 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

Sul mio sistema, non ho il renamecomando. Ecco una semplice fodera. Trova ricorsivamente tutti i file HTML e li aggiunge prefix_davanti ai loro nomi:

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

1
con findsi può anche eseguire comandi, senza bisogno di un ciclo: stackoverflow.com/a/33297439/2351568
DJCrashdummy

0

Questo farà precedere i tuoi file nella loro directory.

Il ${f%/*}è il percorso fino all'ultimo barra /-> la directory

Il ${f##*/}è il testo senza nulla prima dello scorso barra /-> nome del file senza il percorso

Ecco come va:

for f in $(find /directory/ -type f); do 
  mv -v $f ${f%/*}/$(date +%Y%m%d)_Prefix_${f##*/}
done
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.