2012-01-31 7 views

Odpowiedz

6

Poniższa powinno działać:

dest_base="destination" 
src_dir="src/" 

filesperdir=500 
atfile=0 
atdir=0 
for file in $src_dir/*; do 
    if ((atfile == 0)); then 
     dest_dir=$(printf "$dest_base/%0.5d" $atdir) 
     [[ -d $dest_dir ]] || mkdir -p $dest_dir 
    fi 
    mv $file $dest_dir 
    ((atfile++)) 
    if ((atfile >= filesperdir)); then 
     atfile=0 
     ((atdir++)) 
    fi 
done 
+0

To działało idealnie. Dzięki! – cesmarch

+0

Ma to tę zaletę, że rzeczywiście działa, ale jeśli '$ src_dir/*' jest zbyt długi lub jeśli dest_base zostały skonfigurowane tak, aby mieć miejsce w nią czy każdy plik miał miejsca ani innych znaków specjalnych w nazwie istnieje nadal być kwestia. – Sorpigal

+0

Uwaga: To jest skrypt bash (nie skrypt sh) – Tom

-1

Można zacząć od tego:

mkdir new_dir ; find source_dir | head -n 500 | xargs -I {} mv {} new_dir 

To stworzy new_dir 500 i przenieść pliki z old_dir do new_dir. Nadal musisz ręcznie wywoływać to dla różnych wartości new_dir, aż stary katalog będzie pusty i będziesz musiał postępować z nazwami plików, które zawierają znaki specjalne.

0

ok, następujące rozwiązanie przechowuje pliki tymczasowe wykazy 500 nazw plików. Dostosuj go tak, jak potrzebujesz. Pierwsza lista wszystkich plików w bieżącym katalogu, podzielić 500 przez 500, i przechowywać wyniki w outputXYZ. * Pliki

ls | split -l 500 - outputXYZ. 
# Then we go through all those files 
count=0 
for i in outputXYZ.*; do 
    ((count++)) 
    # We store the result in dir.X directory (created in current directory) 
    mkdir dir.$count 2>/dev/null 

    # And move those files into it 
    cat $i | xargs mv -t dir.$count 

    # remove the temp file 
    rm $i 
done 

Na koniec, masz wszystkie swoje zdjęcia w katalogach dir.1 (1. .500), dir.2 (501..1000), dir.3 itd.

+1

Buggy! Złe użycie 'ls', cytowane' rm $ I' (!) Itp – Sorpigal

+0

Cześć, ja nie dostać swoje „złe nas od ls” komentarzu. – huelbois

+2

Dane wyjściowe 'ls' nie są wiarygodne w żadnym innym celu niż spożycie przez ludzi. Jeśli potrzebujesz listy plików w niezawodny format, powinieneś użyć 'find'. Parsowanie 'ls' będzie działało na dużą liczbę narożnych przypadków. – Sorpigal

9

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
+0

+1, to zdecydowanie podejście, którego bym użył. – Sorpigal

Powiązane problemy