Categories
Linux Tutoriais

Como copiar arquivos aleatoriamente no Linux

Como copiar uma grande quantidade de arquivos recursivamente ou não para um outro dispositivo em ordem aleatória, com o uso dos comandos find, sort e shuf, 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’. 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.

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 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).

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

By 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!

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.

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.