Renomear arquivos e diretórios (adicionar prefixo)

137

Eu gostaria de adicionar prefixo em todas as pastas e diretórios.

Exemplo:

eu tenho

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

Eu gostaria de adicionar o prefixo "PRE_"

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

Saudações,

Rafael
fonte
Use AWK como nesta resposta: awk '$ 0 = "prefixo" $ 0' arquivo> new_file
Mark

Respostas:

224

Graças a Peter van der Heijden , aqui está um que funcionará para nomes de arquivos com espaços:

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

("-" é necessário para ter sucesso com arquivos que começam com traços, cujos nomes seriam interpretados como opções para o comando mv)

CanSpice
fonte
Heh, verdade, isso não funcionará completamente se você tiver um arquivo com um espaço nele.
CanSpice
12
Se você alterar o lscomando *e colocar aspas duplas em torno dos argumentos mv, ele funcionará para arquivos que contenham espaços.
Peter van der Heijden
@ CanSpice É possível reverter esta operação (remover o prefixo) com um script semelhante?
Pascal Qyy 07/07
3
Obrigado, companheiro. O estagiário aqui estava perdendo seus dedos renomeando todos os 67 arquivos. Felicidades.
Felipe
1
Deve ser "mv -" e não apenas "mv", para proteger contra arquivos iniciados por traços, que de outra forma seriam interpretados como opções de comando. Contribuirei com uma edição para corrigir isso.
Jacob C. disse Reinstate Monica
81

Use o script de renomeação desta maneira:

$ rename 's/^/PRE_/' *

Não há problemas com metacaracteres ou espaços em branco nos nomes de arquivos.

tchrist
fonte
3
Alguns sistemas têm um utilitário util-linux chamado "renomear", que funciona de maneira diferente (no Ubuntu, é chamado "rename.ul").
Pausado até novo aviso.
renamesempre me ajudou a lidar com vários nomes de arquivos com muita facilidade.
Alan Haggai Alavi
61

Para adicionar prefixo ou sufixo para arquivos (diretórios), você pode usar a maneira simples e poderosa do xargs :

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

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

Ele está usando a opção de substituição de parâmetro de xargs: -I. E você pode obter mais detalhes na página de manual.

Zheng Qsin
fonte
2
PS: Se você quiser apenas renomear arquivos de peça (diretórios) do diretório atual, basta filtrá-lo antes do xargs, como:ls *.old | xargs -I {} mv {} PRE_{}
Zheng Qsin 7/12/12
curiosamente usando renomear não funcionou. usando xargs correu bem para a minha configuração RHEL tão +1 para esta opção, faz com que seja fácil de entender o comando
Acewin
Não funciona se o nome do arquivo contiver aspas simples, falhará com: xargs: aspas simples incomparáveis; por aspas padrão são especiais para xargs menos que você use a opção -0
Evgeny Veretennikov
36

Isso pode ser feito executando um findcomando simples :

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

O comando acima prefixará todos os arquivos e pastas no diretório atual com PRE_.

Cyclonecode
fonte
8

Para adicionar um prefixo a todos os arquivos e pastas no diretório atual usando util-linux's rename(ao contrário prenameda variante perl do Debian e de outros sistemas), você pode:

rename '' <prefix> *

Ele localiza a primeira ocorrência da sequência vazia (que é encontrada imediatamente) e, em seguida, substitui a ocorrência pelo seu prefixo e cola no restante do nome do arquivo até o final. Feito.

Para sufixos , você precisa usar a versão perl ou usar find .

koyae
fonte
util-linuxno Debian Stretch parece fornecer isso como /usr/bin/rename.ul.
user1338062
7

Se você tem Ruby (1.9+)

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

com Perl:

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

Aqui está um script simples que você pode usar. Eu gosto de usar o módulo não-padrão File::chdirpara lidar com cdoperações de gerenciamento ; portanto, para usar esse script como está, será necessário instalá-lo ( 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
fonte
1

No meu sistema, não tenho o renamecomando. Aqui está um forro simples. Ele encontra todos os arquivos HTML recursivamente e adiciona prefix_na frente de seus nomes:

for f in $(find . -name '*.html'); do mv "$f" "$(dirname "$f")/prefix_$(basename "$f")"; done
conradkleinespel
fonte
1
com findvocê também pode executar comandos, não há necessidade para um loop: stackoverflow.com/a/33297439/2351568
DJCrashdummy
0

Isso irá prefixar seus arquivos no diretório deles.

O ${f%/*}é o caminho até a última barra /-> o diretório

o ${f##*/} é o texto sem nada antes última barra /-> nome do arquivo sem o caminho

Então é assim:

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