É possível dividir o arquivo e anexar as partes com a mesma extensão em um liner?

3

Eu fiz isso em dois comandos: um para dividir e outro para mover. Eu não consigo encontrar meu caminho ao redor, como ter tudo feito com uma linha. O que eu fiz foi:

split.exe --bytes=2300k -d 01_somefile.mp3 01_somefile.mp3

para obter 01_somefile.mp301, 01_somefile.mp302, 01_somefile.mp303 e assim por diante. Então

for file in *0?; do mv "$file" "$file.mp3"; done

para tê-los todos de volta como mp3.

Eu apreciaria se alguém pudesse me ajudar com um forro único para isso que faz um loop no diretório e faz isso dividindo e renomeando. Eu ainda sou pobre com os comandos. Eu tentei isso:

for file in *.MP3; do split.exe --bytes=2500k -d "$file" "$file" && mv "$file" "$file".mp3; done

Eu quero perguntar como posso controlar o nome das peças resultantes. Digamos, eu tenho esse arquivo no diretório: 01_dickens_copperfield.mp3, ao lado de 02.dickens_copperfield.mp3 e assim por diante. Eu ainda estou achando eles grandes e os quero quebrados a outros pedaços e finalmente, os quero renomeado como .mp3

Fazendo

for file in *.MP3; do split.exe --bytes=2500k -d "$file" "$file"; done

produz os arquivos 01_dickens_copperfield.mp301 , 01_dickens_copperfield.mp302 , 01_dickens_copperfield.mp303 e assim por diante. Em seguida, fazendo

for file in *.*; do mv "$file" "$file".mp3; done

dá: 01_dickens-copperfield.mp301.mp3, 01_dickens_copperfield.mp302.mp3, * .mp3ac.mp3 e assim por diante.

Como faço para dividir o arquivo em arquivos com o nome original, mas não a extensão. Deixe mv adicionar extensão. Desculpem por essa exposição tão longa. Estou aprendendo o caminho para essa bela selva, mas cheia de animais poderosos como esses, mv.

    
por innn 28.12.2013 / 17:48

3 respostas

4

Estou assumindo que você use Linux e GNU split . Se sim, você pode fazer isso diretamente com split .

Então, como funciona split ? Como na maioria dos softwares * nix, seu manual está disponível executando man split . Especificamente, o uso geral é

split [OPTION]... [INPUT [PREFIX]]

Isso significa que você pode especificar o prefixo por conta própria. Por exemplo, se você dividir um arquivo chamado foo e fornecer a barra de prefixo:

$ ls
foo
$ split foo bar
$ ls
baraa  barab  barac  foo

Como você pode ver, como um prefixo foi dado a split , ele criou os arquivos chamados bar seguidos de um sufixo ( aa to ac neste caso). Então, no seu caso, você quer dar o nome do arquivo como um prefixo:

for f in *mp3; do split "$f" "$f"

Mas você também deseja remover a extensão para que a divisão em foo.mp3 não resulte em foo.mp3aa , mas fooaa . Isso pode ser feito usando as capacidades de manipulação da string do bash escrevendo ${f%.mp3} em vez de simples $f .

Finalmente, você pode usar outro recurso bacana de split para adicionar a extensão:

   --additional-suffix=SUFFIX
          append an additional SUFFIX to file names.

Então, juntando tudo:

for f in *mp3; do 
   split --bytes=2500k --additional-suffix=".mp3" -d "$f" "${f%.mp3}_"; 
done

Eu corri isso em um diretório que continha os seguintes arquivos:

aa.mp3  bb.mp3  cc.mp3

E isso resultou nesses nomes de arquivos divididos:

aa_00.mp3  aa_02.mp3  bb_00.mp3  bb_02.mp3  cc_00.mp3  cc_02.mp3
aa_01.mp3  aa_03.mp3  bb_01.mp3  bb_03.mp3  cc_01.mp3  cc_03.mp3
    
por 28.12.2013 / 18:34
2

Primeiro, o seu loop parece ter falhas semanticamente - certamente não recria o arquivo original. O que ele faz é renomear os arquivos. Embora isso geralmente funcione (pelo menos até certo ponto) com alguns dados simplesmente estruturados (o que os MP3s realmente são), ele se tornará inutilizável com a maioria dos outros tipos de dados (imagens e muitas vezes vídeo, por exemplo). Nomear os arquivos resultantes com a mesma extensão é, portanto, altamente irrelevante - é bastante enganador, uma vez que os arquivos resultantes não são o que a extensão sugere. Enquanto no UNIX sempre é possível usar o utilitário file para verificar qual é o conteúdo de um arquivo, uma vez que você comece a trabalhar com os dados no Windows (o que seu split.exe sugere), você perceberá que é um pouco sub-óptimo.

Para recriar o original, você precisaria:

> recreated_original.mp3
for f in *0?; do
   cat "$f" >> recreated_original.mp3
done

ou simplesmente use a expansão de curingas do shell:

cat *0? > recreated_original.mp3

Isso naturalmente substituirá recreated_original.mp3 , se já existir.

Se, por algum motivo, você realmente quiser manter a extensão original após o número do bloco, seu loop é uma boa maneira de conseguir isso. Se acontecer de você estar usando split do GNU Coreutils, você pode usar sua opção --additional-suffix :

split --bytes=2300k -d --additional-suffix=.mp3 01_somefile.mp3 01_somefile.mp3.

Observe o ponto final no argumento PREFIX - isso garante que os nomes tenham a seguinte aparência:

01_somefile.mp3.00.mp3
01_somefile.mp3.01.mp3
...

Você pode querer aumentar os números dos fragmentos usando a opção -a , para dividir os arquivos em partes menores (enquanto -a 2 - que é o padrão - geralmente não é suficiente, valor de 3 ou 4 é ok na maioria dos casos).

Caso você precise trabalhar com partes de arquivos diferentes separadamente, você pode fazê-lo, por exemplo, em loop aninhado:

for base in *.00; do
    base=${base%.??}
    for file in $base*; do
        # your stuff goes here
    done
done

${base%.??} retorna o conteúdo da variável base com o ponto final e dois caracteres arbitrários removidos - assim, ele se torna o nome base do primeiro bloco. Lembre-se de remover o ponto se você usar a nomenclatura original do bloco e ajustar o número de caracteres usados para a nomenclatura de partes.

    
por 28.12.2013 / 18:12
2

Quando você fizer a divisão, use basename para remover o .MP3 para criar o radical desejado.

for file in *.MP3; do split.exe --bytes=2500k -d "$file" 'basename "$file" .MP3'; done

Agora seu segundo loop deve fazer o que você quiser.

    
por 28.12.2013 / 18:36