특정 이름 패턴을 사용하여 수백만 개의 파일을 다른 디렉터리로 이동합니다.

특정 이름 패턴을 사용하여 수백만 개의 파일을 다른 디렉터리로 이동합니다.

Linux 시스템에는 다음 명명법을 사용하는 수백만 개의 파일이 있습니다.

1559704165_a1ac6f55fef555ee.jpg

처음 10자리는 타임스탬프이고 다음 10자리 _는 특정 ID입니다. 특정 파일 이름 ID와 일치하는 모든 파일을 다른 폴더로 이동하고 싶습니다.

파일이 포함된 디렉토리에서 이것을 시도했습니다.

find . -maxdepth 1 -type f | ??????????_a1ac*.jpg |xargs mv -t "/home/ubuntu/ntest"

하지만 오류 메시지가 나타납니다.

bash 1559704165_a1ac6f55fef555ee.jpg: command not found

시도하면 mv ??????????_a1ac*.jpg 인수 목록이 너무 길다는 오류가 발생합니다. 적어도 15개의 서로 다른 파일 이름 패턴이 있습니다. 어떻게 이동합니까?

답변1

다음을 사용해야 합니다.

find . -maxdepth 1 -type f -name '??????????_a1ac*.jpg' \
-exec mv -t destination "{}" +

즉, maxdepth 1하위 디렉터리가 없는 현재 디렉터리에서 검색하고 있음을 의미합니다.

type f파일 검색만을 나타냅니다.

name '??????????_a1ac*.jpg'검색 중인 파일과 일치하는 패턴입니다.

mv -t destination "{}" +일치하는 파일을 대상으로 이동함을 나타냅니다. 여기서 +일치하는 새 파일이 이전 파일에 추가됩니다. 예를 들면 다음과 같습니다.

mv -t dest a b c d

여기서 abcd는 다른 파일입니다.

답변2

주문,

find . -maxdepth 1 -type f | ??????????_a1ac*.jpg |xargs mv -t "/home/ubuntu/ntest"

모든 파일 목록을 모든 파일로 파이프하세요!

find . -maxdepth 1 -type f -name `*_a1ac*.jpg` -print0 |\
xargs  -0 -r mv -t "/home/ubuntu/ntest"

작동합니다.

답변3

당신은 매우 가깝습니다. 이 -name옵션을 사용해야 합니다 find. 그리고 패턴을 인용하는 것을 잊지 마세요.

그래서

find . -maxdepth 1 -type f -name '??????????_a1ac*.jpg' |xargs mv -t "/home/ubuntu/ntest"

답변4

mv동일한 호스트 시스템 ( 사용 중인 것으로 추측됨)에서 파일을 이동하려는 경우 rsync더 빠른 옵션일 수 있습니다.

rsync -av --inplace -W /source/??????????_a1ac*.jpg /home/ubuntu/ntest/

--inplace-W프로세스 속도를 높일 준비를 하세요 .

이것이 또 다른 것을 만들어 낼 것인가?매개변수 목록이 너무 깁니다. 오류그런 다음 목록을 피드에 제공할 수 있습니다.rsync

예를 들어, 목록을 만들려면 find를 사용하세요.

find . -maxdepth 1 -type f -name '??????????_a1ac*.jpg' > /tmp/my_image_list.txt

그리고 그것을 줘rsync

rsync -av --inplace -W --files-from=/tmp/my_image_list.txt /path/to/files /home/ubuntu/ntest/

여기서 출처는 귀하가 제공하는 목록이 귀하의 출처와 관련된 것으로 간주되기 /path/to/files때문 입니다.rsync


주요 사항은 다음과 같습니다.rsyncmv파일이 동일한 파일 시스템에 없으면 더 빠릅니다..

관련 정보