Bạn có thể tạo ra các tên tập tin mới sử dụng, ví dụ, sed:
$ echo "test.jpg" | sed -e 's/^\(\(.\)\(.\)\(.\).*\)$/\2\/\3\/\4\/\1/'
t/e/s/test.jpg
Vì vậy, bạn có thể làm một cái gì đó như thế này (giả sử tất cả các thư mục đã được tạo ra) :
for f in *; do
mv -i "$f" "$(echo "$f" | sed -e 's/^\(\(.\)\(.\)\(.\).*\)$/\2\/\3\/\4\/\1/')"
done
hoặc, nếu bạn không thể sử dụng cú pháp bash $(
:
for f in *; do
mv -i "$f" "`echo "$f" | sed -e 's/^\(\(.\)\(.\)\(.\).*\)$/\2\/\3\/\4\/\1/'`"
done
Tuy nhiên, xem xét số lượng các tập tin, bạn có thể chỉ muốn sử dụng perl như đó là rất nhiều các quá trình sed và mv để đẻ trứng:
#!/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 được chắc chắn giới hạn cùng hệ thống tập tin chỉ , mặc dù bạn có thể sử dụng File::Copy::move
để giải quyết vấn đề đó.
1 triệu hình ảnh eh? Đó là rất nhiều khiêu dâm! –