리눅스:이동 1 백만으로 파일을 prefix 기반 생성된 폴더
문제
나는 디렉토리"라는"이미지에 대해서는 백만 명 이미지입니다.네.
쓰고 싶은 쉘 명령어 이름을 바꾸는 모든 이들의 이미지 형식은 다음과 같:
원래: filename.jpg
새: /f/i/l/filename.jpg
어떤 방법이 있나요?
감사합니다,
Dan
해결책
for i in *.*; do mkdir -p ${i:0:1}/${i:1:1}/${i:2:1}/; mv $i ${i:0:1}/${i:1:1}/${i:2:1}/; done;
그만큼 ${i:0:1}/${i:1:1}/${i:2:1}
부품은 아마도 가변적이거나 짧거나 다른 일 수 있지만 위의 명령은 작업을 수행합니다. 당신은 아마도 성능 문제에 직면 할 것입니다. 그러나 당신이 정말로 그것을 사용하고 싶다면, *.*
더 적은 옵션으로 (a*.*
, b*.*
또는 당신에게 맞는 것)
편집 : 추가 a $
~ 전에 i
~을 위한 mv
, Dan이 언급 한 바와 같이
다른 팁
예를 들어 SED를 사용하여 새 파일 이름을 생성 할 수 있습니다.
$ echo "test.jpg" | sed -e 's/^\(\(.\)\(.\)\(.\).*\)$/\2\/\3\/\4\/\1/'
t/e/s/test.jpg
따라서 다음과 같은 일을 할 수 있습니다 (모든 디렉토리가 이미 작성되었다고 가정) :
for f in *; do
mv -i "$f" "$(echo "$f" | sed -e 's/^\(\(.\)\(.\)\(.\).*\)$/\2\/\3\/\4\/\1/')"
done
또는 배쉬를 사용할 수없는 경우 $(
통사론:
for f in *; do
mv -i "$f" "`echo "$f" | sed -e 's/^\(\(.\)\(.\)\(.\).*\)$/\2\/\3\/\4\/\1/'`"
done
그러나 파일의 수를 고려할 때 Perl을 SED 및 MV 프로세스가 많이 사용하므로 PERL을 사용할 수 있습니다.
#!/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은 반드시 동일한 파일 시스템으로만 제한되지만 사용할 수는 있지만 File::Copy::move
그 주위에.
배쉬 스크립트로 할 수 있습니다.
#!/bin/bash
base=base
mkdir -p $base/shorts
for n in *
do
if [ ${#n} -lt 3 ]
then
mv $n $base/shorts
else
dir=$base/${n:0:1}/${n:1:1}/${n:2:1}
mkdir -p $dir
mv $n $dir
fi
done
말할 필요도없이, 당신은 짧은 이름의 공간과 파일에 대해 걱정해야 할 수도 있습니다.
짧은 파이썬 스크립트를 제안합니다. 대부분의 쉘 도구는 그 많은 입력에 시달릴 것입니다 (Xargs는 트릭을 수행 할 수 있습니다). 초 안에 예제로 업데이트됩니다.
#!/usr/bin/python
import os, shutil
src_dir = '/src/dir'
dest_dir = '/dest/dir'
for fn in os.listdir(src_dir):
os.makedirs(dest_dir+'/'+fn[0]+'/'+fn[1]+'/'+fn[2]+'/')
shutil.copyfile(src_dir+'/'+fn, dest_dir+'/'+fn[0]+'/'+fn[1]+'/'+fn[2]+'/'+fn)
모든 제안된 솔루션을 사용하는 와일드카드는 구문에서 포탄이 실패할 가능성이 높으로 인해 단순한 숫자 파일이 있다.의 현재 제안 솔루션,perl 이나 아마도 최고입니다.
그러나,쉽게 적용할 수 있습의 쉘 스크립트 방법을 다루는 어떤 숫자의 파라:
ls -1 | \
while read filename
do
# insert the loop body of your preference here, operating on "filename"
done
나는 여전히 사용하여 perl,하지만 경우에 당신은 제한을 갖는 간단하 unix 도구,그 결합 위의 하나 쉘 솔루션으로 반복처럼 내가 같이 받아야 합니다.그 느리고,하지만.