mv 'ls | head -500' ./subfolder1/
Eu tenho essa pasta enorme com milhares de arquivos não ordenados. É possível mover os primeiros 5000s para uma subpasta através do comando mv
? Por enquanto eu movo arquivos com
mv *some_pattern* ./subfolder1/
Por enquanto, movo imagens aleatoriamente, não é realmente importante se não houver exatamente 5000 arquivos em cada subpasta. Tem algum jeito melhor de fazer isso?
com zsh
:
mv -- *(D.oN[1,5000]) ./subfolder1
Para mover até 5000 arquivos regulares na ordem em que estão no diretório.
Para os primeiros 5000 na lista lexicograficamente ordenada:
mv -- *(D.[1,5000]) ./subfolder1
Se você obtiver um erro sobre a lista de argumentos por muito tempo . Você pode usar o comando buitin zsh
de mv
emitindo:
zmodload zsh/files
primeiro.
POSIXly:
set --
for f in .* *; do
[ "$#" -lt 5000 ] || break
[ -f "$f" ] || continue
[ -L "$f" ] && continue
set -- "$@" "$f"
done
mv -- "$@" subfolder1/
Uma versão simples e compatível com caracteres especiais, espaços, etc.
ls -Q dir1 | head -1000 | xargs -i mv dir1/{} dir2/
Para que isso funcione como está, dir2
deve existir e você precisa executá-lo no diretório pai de dir1
e dir2
.
Isto irá mover 1000 arquivos de dir1 para dir2.
Talvez seja necessário fazer algo assim:
x=1
for file in *
do
if [ "X$x" = "X#####" ]; then
break
fi
mv $file <destination>
x='expr $x + 1'
done
Este script funciona nas variantes bash, ksh, sh e múltiplas do UNIX.
execute abaixo do comando
find . -name 'Hello*.gz' | head -n 5000 | xargs -I {} mv {} /data01/path/
No comando find
, .
(ponto) indica o diretório atual
localiza os arquivos que começam com Olá e terminam com gz, os primeiros 5000 arquivos serão movidos para o caminho /data01/path/