relação de arquivos

Como copiar arquivos aleatoriamente no Linux

Copiar ou mover uma quantidade de arquivos, de um diretório no seu sistema, para outro, em ordem aleatória, tem suas utilidades.
Se você tem uma pequena caixa de som, com entrada USB ou cartão SD e quer ouvir suas músicas em ordem aleatória, misturadas ao acaso, mas não tem o botão random ou shuffle no aparelho — a solução é garantir que as músicas já estejam em ordem aleatória no seu dispositivo de armazenamento.
Este problema é interessante e possui várias formas de ser resolvido, no GNU/Linux.
Vamos conhecer algumas.
Antes de começar, contudo, recomendo copiar todas as músicas que você pretende envolver no processo para um outro diretório e fazer a operação a partir dele. Se algo der errado, as chances de perder arquivos é menor.

Use o comando shuf no Linux

Se você tem o aplicativo shuf (shuffle, quer dizer embaralhar) instalado, pode resolver o problema com uma linha de comando simples.
No exemplo abaixo, as músicas estão todas juntas em uma pasta chamada ‘origem’. Serão copiadas para a pasta ‘destino’.

shuf -zen200 origem/* | xargs -0 mv -t destino

Explicando o comando shuf -zen200 — com seus 3 parâmetros:

  • -z — finaliza cada linha (da lista de arquivos que vai ser criada na memória) com um 0 byte
  • -e — trata cada argumento como uma nova linha input
  • -n200 — determina a quantidade de linhas a ser processada. Altere o valor para quantidade de arquivos presente no seu diretório

O utilitário xargs cria e executa a linha de comando a partir da saída fornecida pelo shuf.
De acordo com o manual do xargs, a opção ‘-0’ indica que os itens terminam com um caractere null (sem valor), em vez de espaços em branco e que os (eventuais) caracteres especiais (que compõem os nomes dos arquivos) não devem ser tratados como especiais e devem ser entendidos literalmente.
Por último, a opção ‘-t’, do comando mv, indica que o nome que o segue é nome de diretório e não nome de arquivo comum.
Se você quiser ver a ação acontendo, use ‘-vt’, assim:

shuf -zen200 origem/* | xargs -0 mv -vt destino

Outra alteração que você pode fazer é substituir o comando mv (mover) por cp (copiar):

shuf -zen200 origem/* | xargs -0 cp -vt destino

Para ver os arquivos copiados, no destino, use o comando ls -tlr — com estes parâmetros, o comando ls mostra os arquivos na ordem em que foram gravados.

Lista de arquivos mp3
Clique para ver detalhes.

Use o comando find para listar, embaralhar e copiar arquivos de um diretório para outro

Uma solução equivalente envolve o comando find.
Um pouco mais complexa, porém mais flexível é voltada para usuários mais avançados.
Com esta opção é possível entrar recursivamente nos diretórios em busca de arquivos e transferi-los para dentro de outro diretório ou dispositivo de armazenamento, “totalmente desorganizados”, do jeito que eu quero.
Veja como funciona:

find origem -type f -print0 | sort -Rz | cut -d $'\0' -f-200 | xargs -0 cp -nvt destino

Se você quiser entender melhor o comando find, leia alguns artigos que contém exemplos dele.

Como renomear os arquivos aletoriamente

O que resta saber, agora, é se o seu mp3 player “físico” toca os arquivos na ordem em que se encontram na mídia de armazenamento ou se os toca em ordem alfabética (ou qualquer outra).
No meu caso, os arquivos são tocados na ordem em que foram gravados.
Se este não for o seu caso e se seus arquivos seguem o padrão de ter em seus nomes a identificação do cantor/banda etc. tudo o que fizemos até aqui, provavelmente terá sido inútil.
O meu player (velhinho) não exibe no visor o nome do arquivo que está tocando.
Esta característica torna os nomes dos arquivos irrelevantes, quando conecto uma mídia de armazenamento nele.
Portanto, se eu renomear todos os meus arquivos mp3 aleatoriamente, vou obter o mesmo resultado: tocá-los aleatoriamente.
A linha de comando, que segue, altera os nomes de arquivos usando o sha1sum, para gerar códigos aleatórios.
Recomendo copiar seus arquivos para um diretório temporário antes de executar o próximo comando — uma vez que ele impossibilitará saber “quem é quem” no diretório, depois que alterar todos os nomes (veja o resultado, na imagem abaixo).
nomes de arquivos aleatórios
Entre no diretório contendo seus arquivos e execute o seguinte:

for fname in *.mp3; do mv -v "$fname" $(echo "$fname" | sha1sum | cut -f1 -d' ').mp3; done

Agora copie os arquivos pro pendrive ou cartão SD e veja se funcionou!

Referência: http://unix.stackexchange.com/questions/38335/best-method-to-collect-a-random-sample-from-a-collection-of-files

Publicado por

Elias Praciano

Autor de tecnologia (livre, de preferência), apaixonado por programação e astronomia. Fã de séries, como "Rick and Morty" e "BoJack Horseman". Me siga no Twitter e vamos trocar ideias!

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *