Można wygenerować nową nazwę pliku używając np sed:
$ echo "test.jpg" | sed -e 's/^\(\(.\)\(.\)\(.\).*\)$/\2\/\3\/\4\/\1/'
t/e/s/test.jpg
Tak, można zrobić coś takiego (zakładając, że wszystkie katalogi są już utworzone) :
for f in *; do
mv -i "$f" "$(echo "$f" | sed -e 's/^\(\(.\)\(.\)\(.\).*\)$/\2\/\3\/\4\/\1/')"
done
lub, jeśli nie można użyć składni bash $(
:
for f in *; do
mv -i "$f" "`echo "$f" | sed -e 's/^\(\(.\)\(.\)\(.\).*\)$/\2\/\3\/\4\/\1/'`"
done
Jednak biorąc pod uwagę liczbę plików, może po prostu chcesz używać Perl jak to wiele procesów sed i mV do tarła:
#!/usr/bin/perl -w
use strict;
# warning: untested
opendir DIR, "." or die "opendir: $!";
my @files = readdir(DIR); # can't change dir while reading: read in advance
closedir DIR;
foreach my $f (@files) {
(my $new_name = $f) =~ s!^((.)(.)(.).*)$!$2/$3/$4/$1/;
-e $new_name and die "$new_name already exists";
rename($f, $new_name);
}
Perl jest z pewnością ograniczona do osób tej samej plików tylko , ale możesz ominąć to za pomocą File::Copy::move
.
1 milion obrazów eh? To dużo porno! –