A "proste" find/xargs zrobi:
find -maxdepth 1 -type f -print0 | xargs -r -0 -P0 -n 500 sh -c 'mkdir newdir.$$; mv "[email protected]" newdir.$$/' xx
Objaśnienie:
- znaleźć
-maxdepth 1
zapobiega znaleźć z rekurencyjnie przejeżdżające żadnych katalogów, bezpieczeństwo, nie jest potrzebny, jeśli wiesz, nie masz katalogów
-type f
wyszukiwanie tylko plików
-print0
oddzielne pliki o zerowej char zamiast LF (aby obsłużyć dziwne nazwy)
- xargs
-r
nie działają z listy pusty argument
-0
odczytać pliki oddzielone z zerową
-P0
twórz tyle procesów, ile potrzebujesz
-n 500
uruchom każdy proces z 500 argumentami
- sh
-c
linia skryptu polecenie uruchomienia dostarczane jako kolejnego argumentu
mkdir newdir.$$
zrobić nowy katalog kończąc proces powłoki PID
mv "[email protected]" newdir.$$/
przesunąć argumenty skryptu (każdy z nich cytowany) do nowo utworzony katalog pod nazwą skryptu podanego w wierszu poleceń (patrz instrukcja Sh)
pamiętać, że jest nie coś chciałbym użyć w produkcji, to opiera się głównie na na fakt, że $$
(PID) będą różne dla każdego procesu realizowanego przez xargs
Jeśli potrzebujesz plików posortowane, możesz odlać sort -z
między znalezieniem xargs.
Jeśli chcesz bardziej sensownych nazw katalogów można użyć coś takiego:
echo 1 >../seq
find -maxdepth 1 -type f -print0 |sort -z | xargs -r -0 -P1 -n 500 sh -c 'read NR <../seq; mkdir newdir.$NR; mv "[email protected]" newdir.$NR/; expr $NR + 1 >../seq' xx
echo 1 > ../seq
napisać pierwszy sufiks katalogów w pliku (upewnij się, że nie znajduje się w bieżącym katalogu)
-P1
powiedz xargs, aby uruchamiał jedno polecenie naraz, aby zapobiec warunkom wyścigu
read NR <../seq
odczytać sufiks katalogu bieżącego z pliku
expr $NR + 1 >../seq
napisać kolejny przyrostek katalogu dla następnej perspektywie
sort -z
posortować pliki
Co próbowałeś do tej pory? To nie jest witryna "give me the codez". Musisz pokazać, że włożyłeś w NIEKTÓRE wysiłki. –