여러 파일을 여러 디렉터리로 이동

여러 파일을 여러 디렉터리로 이동

다음과 같은 디렉토리가 있습니다

-rw-r--r-- 1 ualaoip2 mcm1    1073233 Sep 30 12:40 database.260.4-0.tar.gz
-rw-r--r-- 1 ualaoip2 mcm1  502373963 Sep 30 12:40 database.260.4-1.tar.gz
-rw-r--r-- 1 ualaoip2 mcm1  880379753 Sep 30 12:40 database.260.4-2.tar.gz
drwxr-xr-x 2 ualaoip2 mcm1       4096 Sep 30 13:41 db0file
drwxr-xr-x 2 ualaoip2 mcm1       4096 Sep 30 13:41 db1file
drwxr-xr-x 2 ualaoip2 mcm1       4096 Sep 30 13:41 db2file

파일을 &c database...0로 이동하고 싶습니다 .folder0

이를 수행하는 가장 좋은 방법은 무엇입니까? 다양한 변형을 시도했습니다

for i in $(ls fi*) do; mv $i ./folder$i

하지만 그들은 일부 항목의 이름을 바꾸고 내가 원하지 않는 많은 항목을 덮어썼습니다!

내가 사용해 본 변형

find . -maxdepth 1 -type d -printf '%f\n' | sort /* why is it not sorted?

그러나 현재 디렉토리로 .

mkdir db{0..7}을 사용하여 파일을 생성합니다. 이것이 최선의 방법입니까?

나는 그 답을 몇 단어로 설명할 수 있었으면 좋겠다. 원숭이가 보는 것뿐만 아니라, 원숭이가 하는 것도 말이다! :-)

답변1

파일 이름 형식을 사용할 수 있는 경우 다음 명령을 사용할 수 있습니다.

for i in $(seq 0 2); do mv database*-"$i".tar.gz "db${i}file"/; done

지침이 있습니다. 귀하의 파일은 안정적인 형식으로 나타나며 database*-NUMBER.tar.gz디렉토리 이름에 동일한 번호가 있습니다 dbNUMBERfile. 우리는 가장 높은 숫자(이 경우 0..2)를 생성하고 이 숫자에 대해 루프를 실행할 수 있습니다. 데이터베이스의 경우 경계에 $i있으므로 단순하면 충분 하지만 변수가 정의되지 않아 작동하지 않으므로 다음을 사용해야 합니다. 중괄호를 사용 하면 올바르게 해결할 수 있습니다.-.db$ifile$ifiledb${i}file$i

답변2

set -o nullglob

for name in database*-*[0-9].tar.gz; do
    num=${name##*-}
    num=${num%%.*}

    [ ! -d "folder$num" ] && mkdir "folder$num"

    mv "$name" "folder$num"
done

database*-*[0-9].tar.gz패턴과 일치하는 모든 파일 이름을 반복합니다 .

변수 num는 파일 이름 끝에 있는 숫자(숫자는 두 자리 이상일 수 있음)가 되며, 먼저 이름부터 마지막 ​​숫자까지 모든 것을 제거한 -다음 점과 모든 것을 제거하여 파일 이름에서 선택됩니다.

대상 폴더가 아직 존재하지 않으면 생성됩니다.

nullglob쉘 옵션을 first로 설정하면 bash패턴이 파일 이름과 일치하지 않으면 루프가 전혀 입력되지 않습니다.


database*.tar.gz원하는 경우 패턴을 변경할 수 있습니다. 루프에서 실제로 사용되는 이름의 모든 구성 요소가 존재하는지 확인하기 위해 약간 더 복잡한 패턴을 사용했습니다.

관련 정보