[unix] 특정 이름 패턴을 사용하여 수백만 개의 파일을 다른 디렉토리로 이동

Linux 컴퓨터에 다음과 같은 명명법을 가진 수백만 개의 파일이 있습니다.

1559704165_a1ac6f55fef555ee.jpg

처음 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 개의 다른 파일 이름 패턴이 있습니다. 어떻게 이동합니까?



답변

다음을 사용해야합니다.

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는 다른 파일입니다.


답변

당신의 명령,

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"

트릭을 할 것입니다.


답변

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

그래서

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


답변

find솔루션 만큼 “좋은” 것이 아니라 또 다른 유효한 솔루션은 mv명령을보다 세분화하는 것입니다.

이것은 mv작업 당 더 적은 수의 파일 이동으로 4096 이동을 수행합니다.

FILEPAT=a1ac
for i in $(seq $((0x000)) $((0xfff)));
do
   H=$(printf '%x\n' $i)
   mv 1559704165_${FILEPAT}${H}*.jpg /home/ubuntu/ntest
done


답변

당신은 내가 당신과 함께하고있는 것 같아요 동일한 호스트 시스템에 파일을 이동하려는 경우 mv, rsync빠른 옵션이 될 수 :

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

--inplace-W과정을 빠르게하도록 설정되어 있습니다.

이로 인해 다른 인수 목록이 너무 긴 오류가 발생 하면 목록을rsync

예를 들어 찾기로 목록을 만드십시오.

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입니다.


요점은 파일이 동일한 파일 시스템에 있지 않은 경우 rsync보다 빠릅니다mv .


답변