Supondo que você tenha um diretório para o qual deseja mover arquivos de .
Você pode usar:
$ mv <source folder/*.jpg <destination folder/>
Editar:
O script abaixo encontra todos os arquivos que correspondem aos critérios de pesquisa definidos por file_screen
e, em seguida, executa um loop while
para mover os arquivos selecionados.
Novos diretórios são criados com base nos critérios do módulo: loop iteration mod files_in_each
. Se mod retorna zero, o novo diretório é criado e os arquivos serão movidos para ele.
Parâmetros para ajustar nas suas execuções:
files_in_each=3000 # controls how many files are placed in each directory
directory_to_move="/home/shadowe/test1/test2" # where are the files located
file_screen="jpg" # only move files that match this criteria
Por favor, ajuste conforme necessário.
#!/bin/bash
# basic definitions and calculations
files_in_each=3000
directory_to_move="/home/shadowe/test1/test2"
file_screen="jpg"
folders_created=0
i=0
# while loop through all of the files that match screening criteria
find $directory_to_move/* -maxdepth 1 -type f -name "*${file_screen}" -print0 | sort -n | while IFS= read -r -d '' file;
do
# modulo control for creating directories every files in each completion
create_dir='expr $i % $files_in_each'
if [ $create_dir -eq "0" ]
then
new_folder=folder$folders_created
mkdir $new_folder
echo "created new folder: " $new_folder
folders_created=$[$folders_created+1]
fi
mv "$file" $new_folder
i=$[$i+1]
done
Pequenos resultados de amostra após a execução:
$ ls test2/
not a picture.txt
$ ls folder0/
one.jpg one*two.jpg picture 1.jpg two-one.jpg
one-two.jpg picture 1111.jpg picture *.jpg two three.jpg
Resultados de amostras grandes:
$ ls folder0 | wc -l
3000
$ ls folder1 | wc -l
2008
$ ls test2 | wc -l
7501
$ ls test2/ | grep "jpg"
$
Script para gerar arquivos de teste:
#!/bin/bash
mkdir test2
touch test2/one.jpg
touch test2/'one-two.jpg'
touch test2/'one*two.jpg'
touch test2/'two-one.jpg'
touch test2/'two three.jpg'
touch test2/'picture 1.jpg'
touch test2/'picture *.jpg'
touch test2/'picture 1111.jpg'
touch test2/'not a picture.txt'
#for large test sample uncomment below
#for i in 'seq 1 7500'; do touch test2/test$i.txt; done
#for j in 'seq 1 5000'; do touch test2/picture$j.jpg; done