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

Como encontrar e listar os maiores arquivos e diretórios no sistema.

Algumas técnicas simples podem ser usadas para listar os maiores arquivos no seu sistema Linux ou FreeBSD, sem o uso de ferramentas gráficas — usando apenas um terminal.
Magic wand
Às vezes é necessário encontrar arquivos e/ou diretórios inteiros, que estão ocupando um espaço precioso em seu disco — e, a partir daí, determinar se sua existência é imprescindível ou não.
Alguns arquivos podem apresentar (pelos mais variados motivos) um crescimento expressivo em seu tamanho. É possível encontrar várias versões do kernel no seu sistema, quando você só precisa de uma.
Arquivos temporários, normalmente, são apagados automaticamente. Mas, se você desligou seu micro em algum momento abruptamente, estes e outros arquivos ainda podem estar lá, impedindo que você expanda o uso do seu HD.
Não há um comando simples para mostrar quais são os maiores arquivos presentes no seu sistema — mas há uma combinação deles, que resolve o problema.
Veja quais são:

  • du — mostra uma estimativa do uso do espaço em um dispositivo de armazenamento (HD, cartão flash, pendrive etc.)
  • sort — ordena as linhas de texto de arquivos ou de dados.
  • head — exibe as primeiras linhas de um arquivo ou de uma lista. Vamos usá-lo para exibir apenas os 10 maiores arquivos no sistema.
  • find — pesquisa o sistema para encontrar determinados arquivos. O comando find é explicado em detalhes no tutorial Como encontrar arquivos no Linux com o comando find — recomendo sua leitura!

arquivos em computador

Como usar o comando du, para ver os maiores diretórios no seu sistema

O comando du pode ser usado para obter estatísticas de ocupação dos diretórios e dos arquivos.
Experimente:

du -h /var

O nome do aplicativo utilitário du é a abreviatura de sua função: disc usage ou uso do disco.

A opção -h torna a leitura mais agradável (human readable) ao mostrar os valores em kilobytes, megabytes, gigabytes etc.
Para ver os 10 maiores arquivos/diretórios dentro de ~/.config, use o seguinte comando:

du -h ~/.config/ | sort -n -r | head -n 10

O meu resultado foi este:

1016K	/home/justin/.config/libreoffice/4/user/database/biblio
804K	/home/justin/.config/google-chrome/Default/Extensions/pokjppmpccggefgcenpngoleemajgnmo/0.2.27_0/libraries
784K	/home/justin/.config/transmission/torrents
760K	/home/justin/.config/google-chrome/Default/Extensions/nmmhkkegccagdldgiimedpiccmgmieda
756K	/home/justin/.config/google-chrome/Default/Extensions/nmmhkkegccagdldgiimedpiccmgmieda/0.0.6.1_0
744K	/home/justin/.config/google-chrome/Default/Extensions/hbdpomandigafcibbmofojjchbcdagbl/3.9.671_0/web/assets/global
744K	/home/justin/.config/google-chrome/Default/Extensions/hbdpomandigafcibbmofojjchbcdagbl/3.9.625_0/web/assets/global
704K	/home/justin/.config/google-chrome/Default/Extensions/hbdpomandigafcibbmofojjchbcdagbl/3.9.671_0/web/assets/global/backgrounds
704K	/home/justin/.config/google-chrome/Default/Extensions/hbdpomandigafcibbmofojjchbcdagbl/3.9.625_0/web/assets/global/backgrounds
696K	/home/justin/.config/google-chrome/Default/Extensions/pokjppmpccggefgcenpngoleemajgnmo/0.2.27_0/styles

Com esta lista, é possível saber onde estão os arquivos com maior extensão e, se for o caso, dar algum encaminhamento a eles.
Use a opção que segue, para ter uma lista mais compacta:

du -hsx ~/.config/* | sort -rh | head -10

Dissecando o comando:

  • du -h — quebra os números e os representa na forma de Kb, Mb, Gb etc.
  • du -s — apresenta apenas um total sumarizado de cada item.
  • du -x — pula os diretórios que, porventura, se encontrem em sistemas de arquivos diferentes.
  • sort -r — inverte a ordem de exibição dos valores.
  • sort -h — torna mais amigável a exibição da lista.
  • head -10 — restringe a exibição da lista aos 10 primeiros itens.

Com o comando find, é possível obter um resultado semelhante. Observe:

find ~/.config/ -printf '%s %p\n'| sort -nr | head -10
14021508 /home/justin/.config/google-chrome/Safe Browsing Bloom
10028176 /home/justin/.config/google-chrome/pnacl/0.1.0.13992/_platform_specific/x86_64/pnacl_public_x86_64_pnacl_llc_nexe
4202496 /home/justin/.config/google-chrome/Default/Storage/ext/chrome-signin/def/Cache/data_3
4202496 /home/justin/.config/google-chrome/Default/Application Cache/Cache/data_3
3923495 /home/justin/.config/google-chrome/Dictionaries/pt-BR-3-0.bdic
3853312 /home/justin/.config/google-chrome/Default/Local Storage/http_www.technobezz.com_0.localstorage
2783258 /home/justin/.config/google-chrome/Safe Browsing Bloom Prefix Set
2711552 /home/justin/.config/google-chrome/Default/Sync Data/SyncData.sqlite3
2392064 /home/justin/.config/google-chrome/Default/Local Storage/https_twitter.com_0.localstorage
2163856 /home/justin/.config/google-chrome/pnacl/0.1.0.13992/_platform_specific/x86_64/pnacl_public_x86_64_ld_nexe

ou esta variação:

find ~/.config/ -printf '%s %p\n'| sort -nr | head -10

Com o comando abaixo, você pode pular nomes de diretórios e exibir apenas os nomes de arquivos mais volumosos:

find ~/.config/ -type f -printf '%s %p\n'| sort -nr | head -10

Os comandos vistos, neste artigo, são apenas o primeiro passo para você conseguir solucionar problemas. Eles podem e devem ser adaptados para se adequar às suas necessidades e ao seu sistema.
Você pode aprender mais sobre Linux, neste site, clicando nos links dados no decorrer do texto ou fazendo buscas personalizadas na caixa de pesquisa, no canto superior do site.
Sinta-se à vontade, também para compartilhar com seus amigos os artigos do site.
Divirta-se!

Como encontrar arquivos no Linux com o comando find

Neste post, vou mostrar alguns exemplos de truques, na linha de comando, para encontrar arquivos entre os diretórios do seu PC Linux.
Os exemplos farão uso do comando find, já presente no sistema — o que significa que você não vai precisar instalar nada.

Saiba mais:

Neste artigo, sobre o programa mpg123, há um exemplo do uso do comando find para criar listas de músicas. Se você se interessar, dê uma olhada!

Para tornar o tutorial mais fácil vou sugerir criar alguns diretórios e arquivos que serão usados nos exemplos deste artigo.
Se você quiser, pode alterar os nomes, mas não esqueça de adequar os exemplos deste texto às alterações que você fez.
Pra começar, recomendo criar um diretório e entrar nele, somente para brincar com o comando find. Abra um terminal e forneça os seguintes comandos:

mkdir exemplos_find
cd exemplos_find

Dentro do diretório criado, exemplos_find, crie alguns arquivos:

touch MeuTextoNovo.txt
touch MeuTexto.txt
touch MeuTextoFalso.txt
touch MeuTextoAntigo.txt

Agora, vamos criar um diretório backup e, dentro dele, vamos criar novamente aqueles mesmos arquivos:

mkdir backup
cd backup
touch MeuTextoNovo.txt
touch MeuTexto.txt
touch MeuTextoFalso.txt
touch MeuTextoAntigo.txt

… e voltamos ao diretório anterior, exemplos_find:

cd ../
ls -R

Como você pôde notar, a opção -R faz o comando ls perscrutar recursivamente outros subdiretórios:

exemplos do comando ls recursivo.
clique para ampliar

Encontre arquivos usando name

O parâmetro name é básico no uso do comando find. No exemplo abaixo, vou mostrar como encontrar todos os arquivos de nome MeuTextoFalso.txt dentro do diretório atual e dentro dos subdiretórios deste:

find -name MeuTextoFalso.txt
./MeuTextoFalso.txt
./backup/MeuTextoFalso.txt

Faça uma busca por nomes de arquivos ignorando maiúsculas e minúsculas

Este é mais um exemplo do uso básico do comando find. Só que, desta vez vou usar o parâmetro iname, que ignora se as letras estão em maiúsculas ou minúsculas durante a pesquisa.

find -iname meutextoantigo.txt
./backup/MeuTextoAntigo.txt
./MeuTextoAntigo.txt

Assim, fica mais fácil, não é?

Como pesquisar com o find, limitando a recursividade

Em alguns momentos, você vai topar com diretórios com uma grande quantidade de subdiretório recursivos. Se você não tem interesse em pesquisar “tão profundamente”, pode limitar a recursividade do comando find.
O arquivo do sistema passwd está presente em vários subdiretórios. Veja:

find / -name passwd
/usr/bin/passwd
/usr/share/bash-completion/completions/passwd
/usr/share/lintian/overrides/passwd
/etc/cron.daily/passwd
/etc/passwd
/etc/pam.d/passwd

Uma coisa que você deve ter notado é que a busca foi demorada em função de ter sido feita a partir do diretório raiz e em todos os subdiretórios do sistema — em alguns deles, você provavelmente não tinha permissão para fazer a busca.
Experimente limitar a recursividade do comando find a 2 subníveis, assim:

find / -maxdepth 2 -name passwd
find: `/root': Permissão negada
find: `/lost+found': Permissão negada
/etc/passwd

Esta pode ser uma forma mais rápida de encontrar o arquivo que interessa.

Aumente a profundidade da pesquisa do find com mindepth

O parâmetro -mindepth (minimum depth, ou profundidade mínima) estabelece a partir de que nível a recursividade deve começar. Experimente:

find / -mindepth 3 -name passwd

Observe que os resultados (abaixo) são diferentes. Eu destaquei, com fundo cinza, aqueles válidos.

find: `/root': Permissão negada
find: `/home/soderberg/.cache': Permissão negada
find: `/home/lost+found': Permissão negada
find: `/sys/kernel/debug': Permissão negada

(...)

/usr/bin/passwd
/usr/share/bash-completion/completions/passwd
/usr/share/lintian/overrides/passwd
/usr/share/doc/passwd
/etc/cron.daily/passwd
find: `/etc/cups/ssl': Permissão negada
find: `/etc/polkit-1/localauthority': Permissão negada
/etc/pam.d/passwd

Execute um comando em relação aos arquivos encontrados pelo find

Este tipo de ação é comumente usada em scripts, mas eu vou mostrar como usar na linha de comando.
Veja como fazer uma busca pelos arquivos “MeuTexto.txt”, ignorando se as letras estão em minúsculas ou maiúsculas, e executar o programa md5sum em cada um deles. Veja como:

find -iname "meutexto.txt" -exec md5sum {} \;

O resultado que obtive foi este:

d41d8cd98f00b204e9800998ecf8427e  ./MeuTexto.txt
d41d8cd98f00b204e9800998ecf8427e  ./backup/MeuTexto.txt

e você?

Como inverter o resultado do comando find

E se, ao invés de mostrar os resultados encontrados, a pesquisa exibisse os resultados diversos do que foi pedido?
Ao usar o parâmetro -not, eu vou indicar ao comando find o que eu não desejo exibir nos resultados. Veja como funciona:

find -not -iname "meutextoantigo.txt"

No resultado, abaixo, a string “meutextoantigo.txt” é a única que não é exibida.

.
./MeuTextoFalso.txt
./MeuTexto.txt
./backup
./backup/MeuTextoFalso.txt
./backup/MeuTexto.txt
./backup/MeuTextoNovo.txt
./MeuTextoNovo.txt

Experimente remover dos resultados o nome de arquivo “meutextofalso.txt”.

find -not -iname meutextofalso.txt

Com este comando, as duas ocorrências do arquivo “MeuTexto.txt” são exibidas e as duas do “MeuTextoFalso.txt” são inibidas na lista. Note, ainda, que usei o texto fora das aspas, desta vez. Quando não há espaço entre as palavras, é possível dispensar as aspas.

.
./MeuTexto.txt
./backup
./backup/MeuTexto.txt
./backup/MeuTextoAntigo.txt
./backup/MeuTextoNovo.txt
./MeuTextoAntigo.txt
./MeuTextoNovo.txt

Encontre arquivos pelas suas permissões

É possível fazer uma busca no sistema para encontrar arquivos com base nas suas permissões. Você pode:

  • Encontrar arquivos que satisfaçam determinadas condições na sua lista de permissões
  • Verificar quando um arquivo corresponde a uma determinada lista de permissões
  • Fazer uma busca pela representação octal/simbólica

Para poder mostrar melhor o funcionamento destas funções vou precisar me afastar um pouco dos exemplos em que vínhamos nos baseando até agora, neste pequeno tutorial.
Observe, na listagem abaixo, as diferentes permissões dos arquivos:

ls -l
total 0
-rwxrwxrwx 1 root root 0 2009-02-19 20:31 tudo para todos
-rw-r--r-- 1 root root 0 2009-02-19 20:30 todo mundo lê
---------- 1 root root 0 2009-02-19 20:31 nada para ninguém
-rw------- 1 root root 0 2009-02-19 20:29 arquivo simples
-rw-r----- 1 root root 0 2009-02-19 20:27 outros também podem ler
----r----- 1 root root 0 2009-02-19 20:27 outros só podem ler

Se você deu uma olhada nos nomes dos arquivos, deve ter percebido que estes explicam (superficialmente) os atributos de suas permissões.
Isto posto, no exemplo que segue, vou mostrar como usar o find para encontrar arquivos com permissão de leitura para um grupo, que seja do tipo arquivo (file) e executar o comando de listagem ls para ele:

find . -perm -g=r -type f -exec ls -l {} \;

O resultado é algo parecido com isto:

-rw-r--r-- 1 root root 0 2009-02-19 20:30 ./todo mundo lê
-rwxrwxrwx 1 root root 0 2009-02-19 20:31 ./tudo para todos
----r----- 1 root root 0 2009-02-19 20:27 ./outros só podem ler
-rw-r----- 1 root root 0 2009-02-19 20:27 ./outros também podem ler

Como encontrar arquivos com permissão de leitura apenas pro grupo, no diretório atual:

find . -perm g=r -type f -exec ls -l {} \;

Experimente alterar o comando e aplicá-lo a outros diretórios, para ver as mudanças nos resultados.
Como último exemplo desta secção vou mostrar como encontrar arquivos com permissão octal 0666, ou seja, podem ser lidos e alterados por todos os usuários do sistema. Primeiro, vou alterar as permissões de um dos arquivos que criamos no diretório exemplos_find:

chmod 0666 MeuTextoNovo.txt

Em seguida, fazer a busca:

find . -perm 0666 -type f -exec ls -l {} \;

O resultado:

-rw-rw-rw- 1 justincase justincase 0 Mai  6 16:27 ./MeuTextoNovo.txt

Você pode fazer uma busca por arquivos executáveis (programas), assim:

find /usr/ -executable -type f -exec ls --color {} \;

Use o comando find para encontrar arquivos vazios

Para isto, use o parâmetro -empty (vazio). No exemplo, abaixo, vou mostrar como fazer a busca, no seu diretório home:

find ~ -empty

Para se restringir ao diretório atual e evitar a recursividade (busca em subdiretórios), use -maxdepth:

find . -maxdepth 1 -empty

Os arquivos que nós criamos, neste tutorial, através do comando touch, estão vazios — nenhum conteúdo foi inserido neles.

./MeuTextoFalso.txt
./MeuTexto.txt
./MeuTextoAntigo.txt
./MeuTextoNovo.txt

Como encontrar pelo tamanho

No exemplo que segue, vou mostrar como encontrar os 7 maiores arquivos no diretório /usr/bin, incluindo seus subdiretórios

find /usr/bin/ -type f -exec ls -s {} \; | sort -n -r | head -7

A execução pode ser um tanto demorada, dependendo da quantidade de arquivos envolvida.
Abaixo, segue o resultado que eu obtive:

8724 /usr/bin/php5
6264 /usr/bin/audacity
5708 /usr/bin/gimp-2.8
4972 /usr/bin/gdb
4364 /usr/bin/shotwell
4168 /usr/bin/aptitude-curses
3788 /usr/bin/mplayer

Para ver os 7 menores, faça assim:

find /usr/bin/ -type f -exec ls -s {} \; | sort -n  | head -7

O parâmetro -size pode ser usado para encontrar arquivos com um determinado tamanho ou maior do que um certo tamanho.
Veja como encontrar arquivos com tamanhos maiores que 100Mb no diretório /var:

find /sys -size +100M
/sys/devices/pci0000:00/0000:00:02.0/resource2_wc
/sys/devices/pci0000:00/0000:00:02.0/resource2

Alguns diretórios do sistema, como eu já disse, podem precisar de privilégios administrativos para mostrar seu conteúdo.
Encontrar arquivos menores do que um certo número também é fácil:

find /usr/share/icons -size -2k

Neste caso, a lista pode ser grande.

Encontre arquivos pelo tipo

Para encontrar arquivos do tipo socket:

find . -type s

Para ver a relação de diretórios:

find . -type d
.
./backup

Encontre os arquivos escondidos no seu diretório pessoal (home):

find ~ -type f -name ".*"

Conclusão

É impossível imaginar a enorme quantidade de aplicações que este comando permite, ainda mais quando podemos combiná-lo com a execução de outros comandos, como o ls, o rm etc.
Altere os exemplos deste artigo para fazer com que o find execute a tarefa que você deseja e, sinta-se à vontade para compartilhar a sua experiência ou suas dicas de uso do comando nos comentários.

Como copiar arquivos recursivamente no linux (no terminal)

Você provavelmente veio parar aqui por que usou um comando semelhante a este:
cp -r /origem/*.mp3 /destino/
e não funcionou.
Há várias formas de fazer isto, com arquivos de qualquer extensão (*.mp3, *.jpg, *.txt etc.). Como você já sabe, cp -r não é uma delas.

Como copiar arquivos recursivamente com os comandos find e cpio

Estes comandos dão conta do recado. O primeiro encontra os arquivos do tipo desejado, recursivamente. O outro faz a cópia, mantendo a estrutura de diretórios.
Adapte a linha de comando, que segue, para que ela atenda às suas necessidades.
$ find /caminho/de/origem/ -name ‘*.mp3’ | cpio -pdm /caminho/de/destino/

LEIA MAIS

Veja o que as opções ‘-pdm’ fazem:

  • -p habilita a operação de cópia recursiva
  • -d cria a estrutura de diretórios no destino, de acordo com a original
  • -m preserva as datas de modificação dos arquivos