
나는 매우 무질서한 전자책을 많이 가지고 있습니다. 그 중 일부는 자체 디렉터리에 혼자 있고 일부는 손상되었으며 일부 디렉터리는 비어 있습니다. 이렇게 다양한 디렉토리에서 전자책을 모아서 읽고 재구성할 수 있도록 모두 한 폴더에 넣으려면 어떻게 해야 합니까? 나는 기본 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 -l
1보다 크기 때문에 파일에 하드 링크가 있음을 알 수 있습니다.
심볼릭 링크를 만들려면 먼저 대상 디렉터리로 변경하고 (현재 디렉터리를 나타냄)을 대상으로 ln -s
사용하여 호출합니다. .
심볼릭 링크는 "대신 저쪽에 있는 이 파일을 보세요"라고 말하는 파일입니다. 심볼릭 링크를 제거해도 원본 파일에는 영향을 미치지 않습니다. 원본 파일을 이동하거나 제거하면 기호 링크가 매달려 있게 됩니다(즉, 여전히 거기에 있지만 더 이상 파일을 가리키지 않습니다).
디렉토리 아래의 빈 디렉토리를 제거하려면 다음을 사용할 수 있습니다.
find /some/directory -depth -type d -empty -delete