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’. E serão copiadas para a pasta ‘destino’.
shuf -zen200 origem/* | xargs -0 mv -t destino
Abaixo, explico os parâmetros do comando shuf:
- -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.
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 o find, é 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 quiser entender melhor o comando find, leia alguns artigos que contém exemplos dele.
Como renomear os arquivos aleatoriamente
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 — tal como os primeiros modelos do iPod da Apple.
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.
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, depois de sua execução, você nunca mais saberá “quem é quem” no diretório, depois que alterar todos os nomes (veja o resultado, na imagem abaixo).
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!
2 replies on “Como copiar arquivos aleatoriamente no Linux”
Olá, existe uma maneira de passar no comando um limite para realizar essa cópia?
Por exemplo, tenho um diretório com 100 músicas e pretendo escolher apenas 50 músicas de maneira aleatória, salvando-as em outro arquivo.
Matheus, edite o primeiro comando: em vez de ‘-zen200’ use ‘-zen50’.