Acrescentar algo aos arquivos que não terminam com “]” recursivamente

3

Eu estou tentando acrescentar [Full] a todos os arquivos que não terminam com ] em todos os subdiretórios recursivamente.

Exemplo:

Untold Story.wav deve ser renomeado para Untold Story [Full].wav

Untold Story [Instrumental].wav deve não ser renomeado para Untold Story [Instrumental] [Full].wav

Obrigado!

    
por BlackR 31.05.2015 / 19:51

4 respostas

3

O script abaixo deve fazer o trabalho. Para usá-lo:

  1. Copie em um arquivo vazio
  2. Salvar como rename.py
  3. Execute:

    python3 /path/to/rename.py <directory_with_files>
    

O script:

#!/usr/bin/env python3
import shutil
import os
import sys

for root, dirs, files in os.walk(sys.argv[1]):
    for file in files:
        check = file.rfind("."); name = file[:check]
        print(name)
        if all([not name.endswith("]"), check not in (-1, 0)]):
            shutil.move(root+"/"+file, root+"/"+name+" [Full]"+file[check:])

O que faz:

  • Divide o arquivo em basename + extension (todos os arquivos dentro de um diretório recursivamente)
  • Vê se o nome da base terminar com "]"
  • Se não, adiciona "[Full]" ao nome da base, associa-o à extensão e move (renomeia) o arquivo.
  • Arquivos invisíveis ou arquivos sem extensão são deixados em paz.
  • Funciona com todas as extensões
por Jacob Vlijm 31.05.2015 / 20:11
3

Isso adicionará [FULL] aos nomes de todos os .wav cujos nomes não terminam em ].wav :

find . -type f ! -name '*].wav' -exec bash -c 'mv "" "${1%.wav} [FULL].wav"' none {} \;

Como funciona

  • find . -type f ! -name '*].wav'

    Isso recursivamente localiza todos os arquivos regulares no diretório atual, . , cujos nomes não terminam em ].wav .

    -name '*].wav' procuraria por arquivos cujos nomes terminam em ].wav . Como ! é negação, ! -name '*].wav' procura todos os arquivos cujos nomes não terminam em ].wav

  • -exec bash -c 'mv "" "${1%.wav} [FULL].wav"' none {} \;

    Isso renomeia os arquivos que find encontraram.

    Isso transmite o nome do arquivo para bash como seu primeiro argumento, . mv é usado para renomear o arquivo.

por John1024 31.05.2015 / 20:36
3

E minha versão com find , xargs e rename

find . -type f -iname "*.wav" -print0 | xargs -0 -I {} rename -v 's/^(.*[^\]])(\..*)/ [Full]/' {}
  • O início é simples, find … , você pode facilmente alterar a pasta de início ( . ) e os arquivos correspondentes ( *.wav ):

    Pesquise na pasta atual ( . ) para todos os arquivos ( -type f ) com a extensão .wav ( -iname "*.wav" )

  • Crie um comando rename com xargs

    O {} em rename … é substituído pelos find results

Algo expressões regulares e funciona.

    
por A.B. 31.05.2015 / 22:09
0

Isso funcionará apenas para arquivos com um nome de arquivo, incluindo uma extensão:

Usando find + xargs + rename :

find . -type f -regex "^.*[^]]\..*$" -print0 | xargs rename -n "s/^(.*)(\..*)$/$1 \[Full\]$2/"
  • . in find : lista todos os arquivos e pastas no diretório de trabalho atual, recursivamente
  • -type f in find : lista apenas os arquivos
  • -regex "[...]" : lista apenas arquivos com um nome de arquivo correspondente ao [...] regex
  • ^.*[^]]\..*$ : corresponde a qualquer string que não tenha um caractere ] anterior ao último caractere .
  • -print0 in find : imprime nomes de arquivos seguidos por um caractere NULL em vez de um caractere de nova linha
  • xargs : passa o caminho de cada arquivo para rename
  • -n in rename : imprime as alterações sem aplicá-las
  • s/^(.*)(\..*)$/$1 \[Full\]$2/ : acrescenta uma string [Full] antes do último caractere . no nome do arquivo

Para aplicar as alterações, remova a opção -n do comando rename :

find . -type f -regex "^.*[^]]\..*$" -print0 | xargs rename "s/^(.*)(\..*)$/$1 \[Full\]$2/"
    
por kos 31.05.2015 / 21:20