서버에 50,000 pdf 및 기타 파일과 같은 많은 파일 디렉토리가 있습니다. 특정 디렉토리를 다른 디렉토리로 이동해야합니다. CSV 또는 다른 텍스트 형식으로 이동 해야하는 파일 목록을 생성 할 수 있습니다.
내가해야 할 일은 bash 스크립트를 실행하고 텍스트 파일에 나열된 파일을 다른 디렉토리로 이동하거나 복사하는 것입니다.
이 작업을 수행하는 쉬운 방법이 있습니까? 어떤 제안이나 자료라도 대단히 감사하겠습니다.
서버에 50,000 pdf 및 기타 파일과 같은 많은 파일 디렉토리가 있습니다. 특정 디렉토리를 다른 디렉토리로 이동해야합니다. CSV 또는 다른 텍스트 형식으로 이동 해야하는 파일 목록을 생성 할 수 있습니다.
내가해야 할 일은 bash 스크립트를 실행하고 텍스트 파일에 나열된 파일을 다른 디렉토리로 이동하거나 복사하는 것입니다.
이 작업을 수행하는 쉬운 방법이 있습니까? 어떤 제안이나 자료라도 대단히 감사하겠습니다.
답변:
rsync와 프로세스 (파일 목록을 취할 수있는 몇 가지 옵션이 있습니다 --files-from
, --include-from
등).
예를 들어, 이것은 트릭을 수행합니다.
rsync -a /source/directory --files-from=/full/path/to/listfile /destination/directory
rsync -a /source/directory --files-from=/full/path/to/listfile /destination/directory
쓸모없는 사용을 피하려면 cat
(및 사용하지 않는 경우 rsync
) :
xargs -a file_list.txt mv -t /path/to/dest
파일이 줄당 하나씩 나열되면 줄 바꿈이 포함되어 있지 않으면 유효한 파일 이름을 처리합니다.
mv
하면 모든 파일이 동일한 대상 디렉토리로 축소됩니다. rsync
허용 된 답변 의 접근 방식에는 이러한 제한이 없습니다.
for file in `cat listoffiles`; do mv "$file" /path/of/destination ; done
bash를 가정 listoffiles
하고 한 줄에 하나의 파일을 포함합니다. rsync 경로에 대한 나의 반대 의견은 OP가 파일을 복사하지 않고 파일 이동 방법을 요구한다는 것입니다. rsync는 왕실의 결혼식보다 더 많은 플래그를 가지고 있으므로 그렇게하기 위해 더 수정할 수는 있지만 때로는 더 간단합니다.
while read -r file; do mv "$file" /path/of/destination ; done < listoffiles
rsync --files-from=file_list.txt /path/to/source/ /path/to/dest/
Rsync는 폴더가없는 경우 자동으로 폴더를 생성하므로 cp
or mv
명령에 비해 추가 이점이 있습니다.
/path/to/source
파일 목록에서 경로를 가져올 때 왜 필요합니까?
실수로 전체 디렉토리를 이동하는 대신 디렉토리의 전체 내용을 대상 디렉토리에 복사했습니다. 이로 인해 원래 디렉토리가 디렉토리에 추가되는 대신 복잡한 대상 디렉토리가 생성되었습니다.
이 문제를 해결하기 위해 다음을 수행했습니다.
ls -rt /path/to/cluttered/destination/directory/ > /opt/dircheck/filestomove
위 명령은 filestomove 파일을 작성합니다. 대상 디렉토리의 모든 내용 목록이 시간순으로 정렬되어 가장 오래된 것부터 가장 오래된 것입니다.
그런 다음 물건을 옮기기 위해 혼란스러운 대상 디렉토리의 하위 디렉토리를 만들었습니다.
mkdir /path/to/cluttered/destination/directory/newsubdirectory
그런 다음 화면에 나열하고 자세한 내용을 표시하는 것을 제외하고 디렉토리 목록을 반복했습니다.
ls -lrht /path/to/cluttered/destination/directory/
이 줄에는 디렉토리가 날짜 오름차순 (시간순으로 정렬 됨)으로 정렬되어 있으며, 현재 혼잡 한 대상 디렉토리에있는 각 파일의 날짜 / 시간 스탬프를 포함하여 자세한 정보가 표시됩니다. 나는 맨 처음부터 시작하여 어떤 디렉토리와 파일을 어디에 보관하고 싶은지를 보여줍니다. 모든 새 파일이 시작되는 파일의 날짜 / 시간 스탬프에 공백이 없어야합니다.
그런 다음 위의 첫 번째 단계에서 만든 파일 (날짜순으로 정렬)을 편집하기 위해 파일을 편집하고 이전에 원래 디렉토리에서 유지하려는 목록에서 일부를 삭제했습니다.
vim /opt/dircheck/filestomove
이동하지 않으려는 모든 파일을 맨 위에서 삭제하십시오.
그런 다음이 게시물에 이미 나열된 명령을 사용하여 내 목록의 파일을 내가 만든 새 디렉토리로 옮겼습니다.
sudo xargs -a /opt/dircheck/filestomove mv -t /path/to/cluttered/destination/directory/newsubdirectory
이것은 모든 파일을 순식간에 이동 시켰습니다. (참고 : 처음에는 sudo가 필요하지 않을 수 있습니다. 이는 파일 권한 문제입니다).
이제 내 원래 대상 디렉토리는 훌륭하고 깔끔하며 모든 파일과 디렉토리가 어수선한 새 디렉토리를 포함합니다.
파일 이름에 불쾌한 문자가없는 경우 (공백, 줄 바꿈, xargs를 사용하여 개별 인수로 나누는 방법을 혼란스럽게 함) 줄 바꿈으로 구분 된 파일 목록 (하나의 파일)을 생성하십시오 한 줄에) 같은 것을 할 수 있습니다.
cat filenames.txt | xargs mv -t /path/to/move/files/to
(일반적으로 man xargs 참조 , 굉장합니다)
특정 mv에 -t 옵션이 없으면 다음과 같은 속임수를 쓸 수도 있습니다
( cat filenames.txt; echo; echo /path/to/move/files/to ) | xargs mv
참고 – 파일 이름에 줄 바꿈이 있으면 예상대로 작동하지 않습니다.
(cat filenames.txt; echo; echo /path/to/move/files/to) | xargs mv
다음은 디렉토리 구조를 유지하면서 모든 PNG 파일을 특정 경로 (및 모든 하위 디렉토리)에서 새 위치로 복사 해야하는 곳에서 나를 위해 일했습니다.
rsync -av --prune-empty-dirs --include='*/' --include='*.png' --exclude='*' source/ destination/
RSYNC는 먼저 디렉토리 구조의 미러를 생성 한 다음 파일을 동기화하므로 비어있는 초과 폴더로 끝날 수 있습니다. 이 빈 디렉토리를 제거하기 위해 --prune-empty-dirs 플래그를 사용했습니다.
나는 제휴 관계가 없지만이 솔루션에 영감을 준 출처를 인정하는 것이 옳다고 생각했습니다. http://techblog.zabuchy.net/2011/transfer-only-selected-file-types-with-rsync/