한 폴더(Pictures)에서 다른 폴더(Pictures-new)로 파일을 반복적으로 이동하고 싶습니다.
"Pictures" 폴더에는 많은 하위 폴더가 있으므로 여기 게시물을 따라가서 이 명령을 사용했습니다.
Pictures와 Picturesnew는 모두 같은 디렉토리에 있습니다. 모든 하위 폴더를 삭제하고 데이터를 병합하고 싶습니다.
이 폴더가 있는 디렉터리에서 다음 명령을 실행합니다.
find ./Pictures -type f -name "*.jpg" -print0 |
xargs -0 -Imysongs mv -i mysongs ./Picturesnew
이제 있어야 할 Picturesnew 폴더가 전혀 없는 것 같아서 20,000개의 JPG 파일이 어디로 갔는지 혼란스럽습니다.
답변1
정말로 원하시나요?
mkdir Picturesnew
find Pictures -type f -iname "*.jpg" -exec mv -i {} + Picturesnew/
mv는 디렉토리를 생성하지 않습니다.
mv에 -i 옵션을 사용하면 해당 파이프라인에서 실행될 때 작동하지 않습니다. (그러나 좋은 점은 mv에게 원본 파일이 아닌 Picturesnew로 이름이 변경된 첫 번째 파일을 짓밟지 말라고 지시한다는 것입니다.)
내 솔루션에서는 대상 디렉터리 이름에 후행 /를 남기고 대상 디렉터리를 만들지 않는 등의 오류 가능성을 최소화하기 위해 실행되는 mv의 각 인스턴스에서 여러 파일을 이동하라고 find에 지시했습니다. 원하는 오류를 생성합니다. 또한 mv가 단순히 다음 파일 이름을 "아니요"로 처리하는 대신 파일 덮어쓰기 확인 메시지를 실제로 표시할 수 있다는 장점이 있습니다.
답변2
-i
승인이 있어야 하는데 재정의할 때 승인이 없는 이유를 모르겠습니다 mv
. 그러나 당신이 그것을 사용하지 않는다고 가정하고 Picturesnew
질문 아래의 설명에서 언급했듯이 작업 후 jpg 파일이 있다는 것을 고려 하면 동일한 파일을 20000 번 덮어 쓰는 것입니다.
xargs -0 -Imysongs mv -i mysongs ./Picturesnew
즉, 모든 매개변수에 대해 다음 명령이 실행됩니다.
mv -i argument ./Picutesnew
디렉토리가 없기 때문에 ./Picturesnew
명령은 mv
파일을 여기로 이동하고 이름을 20000번 변경해야 한다고 생각합니다 ./Picturesnew
.
파이프라인 실행이 완료되면 파일이 하나만 남게 됩니다 ./Picturesnew
. 마지막으로 옮길 것입니다. 이전에 있던 것은 사라졌습니다.
따라서 이 형식이 더 안전합니다.
mv -i argument ./Picturesnew/
그것이 무엇이어야 하는지에 대한 혼란이 /
마침내 사라졌기 때문이다 .Picturesnew
에 대해서는 -i
작동하지 않기 때문에 이 파이프라인에 넣지 않을 것입니다. 확인이 필요합니다.
답변3
다음 명령을 사용하면 목표를 달성할 수 있다고 생각합니다.
find Pictures -type f -print0 | xargs -0 mv -t Picturesnew
여기서 Pictures
는 소스 디렉터리이고 Picturesnew
은 대상 디렉터리입니다.
mv
(및 cp
) 둘 다 mv -t directory source...
와 함께 사용하기에 좋은 형식을 가지고 있습니다 xargs
.
하지만 이 방법은 이름이 중복된 파일을 원래 위치에 보관합니다(나중에 보고 대상에 복사할 수 있으므로 나쁘지 않을 수도 있음).mv -t
입력 리디렉션을 사용할 때 대화형이 작동하지 않습니다.. 이는 xargs
리디렉션된 표준 입력(output find
)에서 값을 읽었고, mv
실행되는 응답 xargs
도 동일한 표준 입력에서 읽으려고 하기 때문입니다 . 따라서 mv를 파이프와 대화식으로 사용할 수 없습니다.
영리한 입력 핸들 재할당으로 작업을 해결할 수도 있지만 더 간단한 방법을 시도해 보겠습니다.출력 리디렉션 제거. 또한 -print0
0바이트를 허용하지 않기 때문에 명령 대체에 사용할 수 없습니다. 다음을 사용하여 for
파일 이름을 반복 해야 합니다 .입력 필드 구분 기호로 개행 문자 사용:
TMP=$IFS;
IFS=$'\n';
for i in $(find Pictures -type f); do
mv -it ../Picturesnew $i;
done;
IFS=$TMP
(한 줄로 복사할 수 있습니다.)
이 경우 mv는 각 중복 항목을 요청할 뿐만 아니라 답변을 기다립니다.
답변4
find Pictures -type f -iname "*.jpg" -print0 | xargs -0 -I {} mv -n "{}" Picturesnew/
이는 구문적으로 더 올바른 솔루션이므로 백업을 복원하고 시도해 보세요.