como mover muitas pastas para uma subpasta no linux?

1

Existem muitos arquivos [*] em uma determinada pasta. Eu gostaria de mover alguns deles para uma subpasta. Como posso:

  • mova os primeiros 3000 arquivos ou pastas para outra pasta ou
  • move arquivos com mais de 3 meses para outra pasta?

Obrigado

  • http://www.google.com/search?hl=&q=Errno%3A%3AEMLINK)+“Too+many+links&
por ohho 12.10.2010 / 14:25

4 respostas

1

De longe, a maneira mais fácil é usar o zsh. Para mover os primeiros 3000 arquivos no diretório atual para /other/directory :

mv *([1,3000]) /other/directory

Se você criou alguns subdiretórios que deseja excluir desse comando:

setopt extended_glob
mv *([1,3000])~(exclude-me|exclude-me-too) /other/directory

Para mover arquivos com mais de 3 meses (o primeiro m é para "tempo de modificação" e o segundo m significa meses; partes fracionárias são ignoradas, então +2 significa ≥3):

mv *(mm+2) /other/directory

Se você preferir usar comandos complicados do que iniciar um shell diferente, estes ainda são razoáveis com o GNU find:

find -mindepth 1 -maxdepth 1 -print0 | head -n 3000 | xargs -0 -i mv {} /other/directory
find -mindepth 1 -maxdepth 1 -mtime +91 -print0 | xargs -0 -i mv {} /other/directory
    
por 12.10.2010 / 20:45
1

O comando find deve ajudar com alguns pequenos scripts sobre ele.

Algumas referências,

  1. Um tutorial de comando do Unix / Linux "find"
  2. Linux encontra exemplos de comandos
  3. Interface de linha de comando Ninja Howto

Descubra como você deseja redistribuir os arquivos e diretórios para escrever sua linha de comando ou script curto com base nesses exemplos.

    
por 12.10.2010 / 15:02
1

Um script como este deve funcionar para mover os primeiros NUMBER_OF_FILES arquivos para SUBDIRECTÓRIO:

NUMBER_OF_FILES=3000  
SUBDIRECTORY=target_folder_name  
NUM=0

find . -type f -maxdepth 1 | sort > /tmp/$$  
exec 4</tmp/$$  
while read FILENAME <&4  
do  
NUM='expr $NUM + 1'  
if [ $NUM -le $NUMBER_OF_FILES ]  
then  
mv $FILENAME $SUBDIRECTORY  
fi  
done  
rm /tmp/$$ 

Algo parecido com isso há 90 dias ou mais:

NUMBER_OF_DAYS=90  
SUBDIRECTORY=target_folder_name  

find . -type f -maxdepth 1 -mtime +$NUMBER_OF_DAYS | sort > /tmp/$$  
exec 4</tmp/$$  
while read FILENAME <&4  
do  
mv $FILENAME $SUBDIRECTORY  
done  
rm /tmp/$$
    
por 12.10.2010 / 16:07
1

Como eu modificaria a resposta de Dennis Williamson:

find . -maxdepth 1 -type f -mtime +30 | rsync -nav --remove-source-files --files-from=- . archive/.

para testes e

find . -maxdepth 1 -type f -mtime +30 | rsync  -av --remove-source-files --files-from=- . archive/.

para a coisa real.

O uso de rsync em vez de mv é apenas porque o rsync suporta a especificação de seus arquivos de origem na entrada padrão. Mas um benefício adicional é que o rsync tem muitas opções para controle detalhado, por exemplo, lidando com links simbólicos.

    
por 12.10.2010 / 17:49