문제

나는 디렉토리"라는"이미지에 대해서는 백만 명 이미지입니다.네.

쓰고 싶은 쉘 명령어 이름을 바꾸는 모든 이들의 이미지 형식은 다음과 같:

원래: 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 도구,그 결합 위의 하나 쉘 솔루션으로 반복처럼 내가 같이 받아야 합니다.그 느리고,하지만.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top