여러 다른 디렉터리에서 파일을 수집하여 한 곳에 보관합니다.

여러 다른 디렉터리에서 파일을 수집하여 한 곳에 보관합니다.

전자책이 너무 많아서 꽤 복잡해요. 그 중 일부는 자체 디렉터리에 단독으로 존재하고 일부는 손상되었으며 일부 디렉터리는 비어 있습니다. 이렇게 다양한 디렉토리에서 전자책을 수집하여 모두 하나의 폴더에 넣어 읽고 재구성하려면 어떻게 해야 합니까? 나는 기본 GNU 명령이나 bash 스크립트를 사용하는 것을 선호합니다.

답변1

적어도 단일 상위 폴더 아래의 다양한 하위 디렉터리에 이 모든 항목이 있다고 가정합니다. 그것은 마치 ~/mybooks. 그렇다면 다음과 같이 할 수 있습니다.

find ~/mybooks -name '*.pdf' -or -name '*.epub' -exec mv -t ~/newdir {} +

.pdf.epub그러면 이름이 디렉토리로 끝나는 모든 파일이나 디렉토리를 찾아서 ~/mybooks디렉토리로 이동합니다 ~/newdir. .pdf이름이 또는 로 끝나는 디렉터리가 있는 경우 파일만 가져오도록 지시문을 .epub추가하세요 .-type f

find ~/mybooks -type f -name '*.pdf' -or -name '*.epub' -exec mv -t ~/newdir {} +

답변2

디렉토리 트리(즉, 디렉토리 및 해당 하위 디렉토리에서 반복적으로)에서 특정 확장자를 가진 모든 파일을 zsh의 단일 디렉토리로 이동하려면 다음을 수행하십시오.

mv -i source/**/*.(pdf|epub) destination/

디렉터리 destination가 이미 존재해야 합니다. source/현재 디렉터리와 그 하위 디렉터리에 있는 파일을 수집하고 싶다면 이 부분을 생략하면 됩니다. 이름에 상관없이 모든 파일을 이동하고 디렉터리는 이동하지 않으려는 경우:

mv -i source/**/*(.) destination/

배쉬에서:

shopt -s extglob globstar
mv -i source/**/*.@(pdf|epub) destination/

파일이 많은 경우 이러한 명령은 명령줄이 너무 길다고 불평할 수 있습니다. 이 경우 find재귀 와일드카드를 사용하는 대신 호출할 수 있습니다.

find source -name '*.pdf' -o -name '*.epub' -exec mv -i -t destination/ {} +
find source -type f -exec mv -i -t destination/ {} +

기존 디렉토리 구조에 일부 정보가 포함되어 있는 경우 파일을 이동하는 것보다 생성하는 것이 더 편리할 수 있습니다.하드 링크또는심볼릭 링크.

하드 링크를 만들려면 ln대신 을 호출하세요 mv -i. 하드 링크를 사용하면 각 파일이 동시에 두 위치에 나타납니다. 원본 파일이나 새 파일이 삭제되면 다른 파일은 남습니다. 파일의 두 위치는 모두 동일합니다. 출력의 두 번째 열에 있는 숫자가 ls -l1보다 크므로 파일에 하드 링크가 있음을 알 수 있습니다.

심볼릭 링크를 만들려면 먼저 대상 디렉터리로 변경한 다음 (현재 디렉터리를 나타냄)을 대상으로 ln -s사용하여 호출합니다. .심볼릭 링크는 "저기 있는 파일을 보세요"라고만 말하는 파일입니다. 심볼릭 링크를 삭제해도 원본 파일은 영향을 받지 않습니다. 원본 파일이 이동되거나 삭제되면 기호 링크가 매달려 있게 됩니다(즉, 여전히 존재하지만 더 이상 파일을 가리키지 않습니다).

디렉토리 아래의 빈 디렉토리를 삭제하려면 다음을 사용할 수 있습니다.

find /some/directory -depth -type d -empty -delete

관련 정보