Troque duas strings separadas por um símbolo em vários nomes de arquivos de um diretório

0

Eu quero alterar uma string como author - name nos nomes de arquivo de alguns livros para name - author . Estou tentando

ls * | sed -r 's/(.+) - (.+).pdf/mv  - .pdf/' | sh

Talvez seja uma mistura de Alternar duas seqüências de comprimento arbitrário separadas por um símbolo e Renomear vários arquivos com sed

Isso não funciona

for file in *; do mv "$file" "$(echo "$file" | sed -r 's/(.+) - (.+).pdf/ - .pdf/')"

Nem

rename 's/\([.]+\) - \([.]+\)\.pdf/ - \.pdf/' *

Isso funciona

rename 's/(.+) - (.+).pdf/ - .pdf/' *
    
por Arturo 03.10.2016 / 14:06

2 respostas

0

Tente isto

% ls -1                                                                                                       
001-foobar.pdf
002-foobar.pdf
003-foobar.pdf

Código

% rename -n 's/([^-]+)-([^\.]+)\.pdf/$2-$1.pdf/' *.pdf                                                          
001-foobar.pdf -> foobar-001.pdf
002-foobar.pdf -> foobar-002.pdf
003-foobar.pdf -> foobar-003.pdf

Nota

(remove -n muda quando seus testes estão OK)

aviso http://pix.toile-libre.org/upload/original/1377510865.png Existem outras ferramentas com o mesmo nome que podem ou não ser capazes de fazer isso, então seja cuidadoso.

Se você executar o seguinte comando ( GNU )

$ file "$(readlink -f "$(type -p rename)")"

e você tem um resultado como

.../rename: Perl script, ASCII text executable

e não contendo:

ELF

então esta parece ser a ferramenta certa =)

Se não, para torná-lo o padrão (normalmente já é o caso) em Debian e derivado como Ubuntu :

$ sudo update-alternatives --set rename /path/to/rename

(substitua /path/to/rename pelo caminho do comando perl's rename .

Se você não tiver esse comando, pesquise seu gerenciador de pacotes para instalá-lo ou faça isso manualmente

Por último, mas não menos importante, esta ferramenta foi originalmente escrita por Larry Wall, o pai do Perl.

    
por 03.10.2016 / 20:55
0

Suponho que os nomes dos arquivos sigam o padrão author - name.pdf e que ambos author e name possam conter qualquer caractere válido além de - cercado por espaços.

find . -type f -name '* - *.pdf' \
    -execdir sh -c 'b=${1% - *}; e=${1#* - }; mv "$1" "${e%.pdf} - $b.pdf"' sh {} \;

Isso encontra todos os arquivos regulares no diretório atual com nomes correspondentes ao padrão * - *.pdf .

Para cada arquivo, uma subshell é executada. O subshell faz o seguinte:

b=${1% - *}  # pick out the start of the filename
e=${1#* - }  # pick out the end of the filename

# Combine $b and $e into a new filename while removing ".pdf" from
# the end of the original filename and adding it to the end of
# the new filename instead.
mv "$1" "${e%.pdf} - $b.pdf"

Teste:

$ ls -l
total 0
-rw-r--r--  1 kk  wheel  0 Aug 30 11:31 arr! - Boaty McBoatface.pdf
-rw-r--r--  1 kk  wheel  0 Aug 30 11:30 hello world - bingo-night!.pdf

$ find . -type f -name '* - *.pdf' -execdir sh -c 'b=${1% - *}; e=${1#* - }; mv "$1" "${e%.pdf} - $b.pdf"' sh {} \;

$ ls -l
total 0
-rw-r--r--  1 kk  wheel  0 Aug 30 11:31 Boaty McBoatface - arr!.pdf
-rw-r--r--  1 kk  wheel  0 Aug 30 11:30 bingo-night! - hello world.pdf

A execução novamente traria os nomes de volta aos originais.

    
por 30.08.2017 / 11:44