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,


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)


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.


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.


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_.


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 .


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) }'

7

com Perl:

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

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: $!";
}

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

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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.