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
.