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.