파일 디렉터리를 하위 디렉터리로 분할하는 방법

파일 디렉터리를 하위 디렉터리로 분할하는 방법

다음과 유사한 파일로 가득 찬 디렉토리가 있습니다.

3260_661901_2008-2008.dat
3260_661901_2009-2009.dat
3260_661901_2010-2010.dat
3260_661901_2011-2011.dat
3260_661901_por-1998.dat
3260_662336_1999-1999.dat
3260_662336_2000-2000.dat
3260_662336_2001-2001.dat
3260_662336_2002-2002.dat

다음과 같이 파일 이름의 6번째와 7번째 문자 다음에 파일을 디렉터리 이름으로 분할하고 싶습니다.

66/3260_661901_2008-2008.dat
66/3260_661901_2009-2009.dat
66/3260_661901_2010-2010.dat
66/3260_661901_2011-2011.dat
67/3260_671901_por-1998.dat
67/3260_672336_1999-1999.dat
67/3260_672336_2000-2000.dat
88/3260_882336_2001-2001.dat
88/3260_882336_2002-2002.dat

하위 디렉터리를 만들고 그 하위 디렉터리로 파일을 이동하는 데 사용할 수 있는 빠른 한 줄 명령이 있습니까?

이 디렉토리에는 33,000개가 넘는 파일이 있다는 점을 언급하고 싶습니다.

답변1

당신이 사용하고 있다고 가정하면 bash실행할 수 있습니다

for f in *.dat; do mkdir -p "${f:5:2}"; mv "$f" "${f:5:2}/"; done

또는 (작업할 파일이 너무 많은 경우 for f in *.dat)

while read f; do mkdir -p "${f:5:2}"; mv "$f" "${f:5:2}/"; done < ls

답변2

노력하다

ls |  awk '{d=substr($0,6,2) ; printf "mkdir %s ; mv %s %s\n",d,$1,d }' | bash
  • 이 경우 ls 결과를 입력으로 사용할 수 있습니다.
  • dir이 first 이후에 존재하기 때문에 오류가 발생합니다 mkdir. 이를 제거하려면 다음을 사용하세요.

    awk '{d=substr($0,6,2) ; printf "test -d %s || mkdir %s ; mv %s %s\n",d,d,$1,d }'
    

관련 정보