Encontre e remova palavras comuns em nomes de arquivos automaticamente

2

Estou usando o Mac OS 10.8.4 e quero renomear alguns lotes usando o Terminal que é um shell bash, eu acho. Eu tenho um grande número de pastas de grande número de arquivos. Os nomes de arquivos têm palavras comuns a outros arquivos nessa pasta que eu gostaria de detectar e remover (excluindo o sufixo do arquivo).

Por exemplo:

A pasta 1 possui arquivos:

blo 123b 2blah 5blah.pdf
blo hazel 124 2blah 5blah.pdf
blo 125 2blah 5blah.pdf

A pasta 2 tem arquivos:

534a blee9.pdf
b546 blee9.pdf
back 675 blee9.pdf

E quero renomeá-los para

Pasta 1

123b.pdf
hazel 124.pdf
125.pdf

Pasta 2

534a.pdf
b546.pdf
back 675.pdf

Eu tenho aplicativos que podem ser encontrados e substituídos, mas eles exigem que eu especifique manualmente o que encontrar. Mas eu não sei de antemão o que são sem olhar manualmente. Além disso, pode haver mais de uma palavra para substituir.

Então eu estava pensando que poderia fazer algo assim:

for each folder {
list all the filenames > output.txt
use grep, replace all word breaks with carriage returns
sort the list alphabetically
use uniq in some way to detect the words I want to remove, and list them
iteratively remove all these words from the file names
}

Algumas considerações adicionais: uma "palavra" pode conter caracteres como =, -, + e assim por diante. Eu quero usar [espaço] como meu divisor de palavras.

Alguém pode ajudar com isso?

    
por Tim 09.09.2013 / 11:05

2 respostas

0

Eu faria isso em perl, porque eu não sou tão bom com o bash.

  1. faça um loop sobre todas as pastas de forma recursiva (procure um algoritmo de percurso de árvore, bastante simples)
  2. Para cada pasta, liste todos os arquivos com ls
  3. use split(' ', sfilename); para criar uma lista de palavras usadas. Inserir em uma lista @common_words
  4. Para cada arquivo seguinte, divida seu nome da mesma maneira e remova qualquer palavra de @common_words não em $filename . (com o grep do perl, por exemplo, ou use um loop)
  5. Depois de ter a lista de palavras comuns, volte a fazer um loop sobre os arquivos e para cada
  6. Para cada arquivo, para cada palavra, renomeie o arquivo para remover a palavra (usando mv do bash com system do perl)
  7. concluído.

Aqui está um script inicial que precisaria ser reformulado, mas aborda seu problema.

Problemas:

  • Se todos os seus arquivos terminarem com "_word.ext", a extensão será removida
  • Se você descomentar a substituição que deveria ignorar a extensão, o mv não funciona mais, então você teria que salvar o nome em um hash: name_without_extention = > "name_with_extension"
  • Ele só analisa uma única pasta e também usa os nomes das subpastas, portanto, é necessário usá-la em uma pasta sem subpasta.

Agora cabe a você melhorar isso =)

    
por 09.09.2013 / 11:26
0

Eu escrevi o código para arquivos dentro de um diretório. Em primeiro lugar, navego para esse diretório no Terminal então eu corro o script python. Ele funciona muito bem para remover partes de nomes de arquivos como '720dpi' sem precisar saber o texto exato com antecedência. Eu sou um iniciante no Python, então o código provavelmente poderia ser melhorado.

link

    
por 15.09.2013 / 11:20