Batch renomeia arquivos no linux usando o nome da pasta

2

Eu tenho uma carga de diretórios ( 2005 - 2012 ), cada um com arquivos ( 01.jpg - 100.jpg ).

Se eu quisesse renomear todos os arquivos para o diretório base, renomeado para, por exemplo, Pasta 2005 - 01.jpg , qual seria a maneira mais fácil de fazer isso pela linha de comando em Linux?

Por exemplo, de

/home/mark/images/2005/01.jpg
/home/mark/images/2005/02.jpg
/home/mark/images/2005/03.jpg
/home/mark/images/2006/01.jpg
/home/mark/images/2006/02.jpg
/home/mark/images/2006/03.jpg

para

/home/mark/images/Folder 2005 - 01.jpg
/home/mark/images/Folder 2005 - 02.jpg
/home/mark/images/Folder 2005 - 03.jpg
/home/mark/images/Folder 2006 - 01.jpg
/home/mark/images/Folder 2006 - 02.jpg
/home/mark/images/Folder 2006 - 03.jpg

Certamente deve haver um simples forro para isso? Eu sei que você pode usar, por exemplo {2005-2012} para acessar os vários diretórios, mas não sei como acessar esse valor mais tarde ao renomear.

    
por Mark 12.02.2013 / 01:38

3 respostas

2
#!/bin/bash
for year in 20??; do
  pushd "$year"
  for file in *; do
    echo mv "$file" ../"Folder ${year} - ${file}"
  done
  popd
done

Remova o echo se a saída parecer boa para você.

    
por 12.02.2013 / 02:05
2

Tente este, supondo que você esteja no diretório com os diretórios de 2005 a 2012):

start=$PWD
for directory in *; do
  cd "$directory"
  for filename in *; do
    mv "$filename" ../"Folder $directory - $filename"
  done
  cd "$start"
done

Ou como um oneliner

start=$PWD; for directory in *; do cd "$directory"; for filename in *; do mv "$filename" ../"Folder $directory - $filename"; done; cd "$start"; done

Árvore de entrada:

.
├── 2005
│   ├── 01.jpg
│   ├── 02.jpg
│   └── 03.jpg
├── 2006
│   ├── 01.jpg
│   ├── 02.jpg
│   └── 03.jpg

Árvore de saída:

.
├── 2005
├── 2006
├── Folder\ 2005\ -\ 01.jpg
├── Folder\ 2005\ -\ 02.jpg
├── Folder\ 2005\ -\ 03.jpg
├── Folder\ 2006\ -\ 01.jpg
├── Folder\ 2006\ -\ 02.jpg
└── Folder\ 2006\ -\ 03.jpg
    
por 12.02.2013 / 02:08
0

Você provavelmente tem o Perl e, portanto, na maioria das distribuições também o comando prename instalado (geralmente vinculado a rename , por exemplo, no Debian e no Ubuntu).

Se for esse o caso, então você pode fazer isso com um verso:

$ ls *
2005:
01.jpg  02.jpg  03.jpg

2006:
01.jpg  02.jpg  03.jpg
$ rename 's#(.+)/(.+)#Folder $1 - $2#' */*
$ ls -F1R
.:
2005/
2006/
Folder 2005 - 01.jpg
Folder 2005 - 02.jpg
Folder 2005 - 03.jpg
Folder 2006 - 01.jpg
Folder 2006 - 02.jpg
Folder 2006 - 03.jpg

./2005:

./2006:

O comando rename usa uma expressão regular que

  1. captura o nome do arquivo até o último separador de diretório / (por exemplo, 2005 ) e o armazena em $1
  2. captura o nome do arquivo após o último separador de diretório / (por exemplo, 01.jpg ) e o armazena em $2
  3. renomeia cada arquivo para Folder $1 - $2 (por exemplo, Folder 2005 - 01.jpg ).

Use a opção rename -n para ver quais alterações serão feitas antes de executar o comando para real.

Nota: este padrão:

s#(.*?)([^/]+)/([^/]+)$#$1Folder $2 - $3#

seria mais robusto, pois permitiria que você renomeie os arquivos corretamente, mesmo que você não forneça a notação relativa do caminho do diretório específico no exemplo. Esse padrão é um pouco mais complicado de explicar, já que se baseia em propriedades de correspondência mais complexas.

    
por 12.02.2013 / 13:58