정렬되지 않은 매우 큰 폴더에서 파일을 찾아 복사하는 쉘 스크립트

정렬되지 않은 매우 큰 폴더에서 파일을 찾아 복사하는 쉘 스크립트

content1_20231110.csv, content2_20231110.csv등 의 다양한 파일로 매일 채워지는 폴더가 있습니다. 제가 통제할 수 없는 이유로 이 폴더에는 1년치의 기록과 수천 개의 파일이 보관됩니다.

현재 이 폴더에서 다른 공유 드라이브로 매일 파일을 수동으로 복사하고 있습니다. 파일 탐색기를 사용하면 수정된 날짜별로 정렬할 수 있어 내가 원하는 모든 파일을 한데 모을 수 있기 때문에 이 작업은 매우 쉬웠습니다. 파일은 밤새 생성되므로 수정 날짜뿐만 아니라 파일 이름의 날짜로 원하는 파일을 식별해야 합니다.

이 작업을 자동화하기 위해 bash 쉘 스크립트를 만들었습니다. 핵심 방법은 이름의 날짜를 기준으로 파일을 식별하고 다음 명령을 사용하여 파일을 복사하는 것입니다.

cp $originalFolderMapping/*$targetDate* $destinationFolderMapping

내가 원하는 파일이 자체 폴더에 격리되어 있으면 제대로 작동합니다(테스트를 위해 이 작업을 수행했습니다). 하지만 정렬되지 않은 원본 폴더를 검색하는 데 시간이 꽤 오래 걸립니다. 공유 드라이브의 파일 속도도 느려질 수 있습니다.

파일 탐색기에서 수정된 날짜별로 정렬하면 빠르고 쉽게 정렬할 수 있으며, 원하는 모든 파일을 나란히 보관하고 수동 복사가 편리합니다. 이 작업을 빠르게 수행하기 위해 쉘 스크립트에서 유사한 작업을 수행할 수 있는 방법이 있습니까? 미리 감사드립니다.

답변1

파일 탐색기에 대한 언급을 보면 여러분이 Windows를 사용하고 있는지, 어쩌면 bash가 cygwin에서 실행되고 있는지 궁금합니다. 이 경우 cygwin 중간 계층은 이미 상대적으로 느린 NTFS 파일 시스템을 훨씬 느리게 보이게 만들 수 있습니다.

Chris Davies가 지적했듯이, 파일 시스템이 네트워크 공유에 있는 경우 "cp"의 glob(파일 경로 확장)이 훨씬 느려집니다.

시도해 볼 수 있는 한 가지 옵션(작동하지 않을 수 있음)은 전체 디렉터리 목록(예: ls -1 $dir >/tmp/file)을 요청한 다음 awk, Python 또는 Perl과 같은 도구를 사용하여 목록을 필터링하고 필요한 변경을 수행하는 것을 고려하는 것입니다. 파일이 밤새 생성되었다는 점을 고려하면 목록 파일은 매우 드물게 업데이트되어야 하므로 파일이 얼마나 최신 상태인지, 현재 작업을 업데이트해야 하는지 여부를 추적하는 것이 좋습니다.

"cp"를 사용하고 있으므로 파일이 삭제되지 않지만 새 파일이 추가되므로 시간이 지남에 따라 문제가 더욱 악화되는 것으로 나타났습니다. 최신 파일 시스템은 일반적으로 이전 파일 시스템보다 훨씬 우수하지만 매우 큰 디렉터리로 작업하면 항상 조회 비용이 발생합니다. NTFS 및 기타 파일 시스템은 해시된 디렉터리 구조를 사용합니다. 즉, 특정 파일 이름을 검색하는 것이 모든 종류의 검색보다 훨씬 빠릅니다.

따라서 두 번째 작업으로 이 폴더의 구성 도우미 작업을 통해 연도별, 주별 등 어떤 방식으로든 분할할 수 있습니다. 당신이 가지고 있는 것은 지속 불가능하고 다양한 형태의 오류가 발생하기 쉽습니다.

관련 정보