#!/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ê.
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.
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
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
/
(por exemplo, 2005
) e o armazena em $1
/
(por exemplo, 01.jpg
) e o armazena em $2
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.
Tags command-line rename linux