("일반 Unix/Linux" 솔루션이 필요하므로 운영 체제 언급이 제거되었습니다.)
작업: "찾기 모드"에서 파일/디렉터리에 대한 작업을 수행하지만 프로세스 중에 파일/디렉터리 경로 이름이 변경될 수 있다고 가정합니다.
"find"의 일반적인 문제는 항목의 이름이 바뀌면 find가 엔터티 수를 세려고 시도하고 해당 엔터티를 찾을 수 없다고 보고한다는 것입니다. 인덱스를 사용하여 작동하는 경우 이러한 문제는 존재하지 않습니다(역방향 조회, inode -> 경로 이름 및 추가 이름 일치를 희생하여).
현재 테마 파일/디렉토리 목록을 얻고 해당 색인을 가져온 다음 "find path -inum index"와 같은 것을 사용하여 파일에 대한 작업을 수행할 현재 이름을 가져옵니다. 결과적으로 스크립트가 다소 투박해 보입니다.
캐시된 경로 이름 대신 인덱스를 사용하여 작동할 수도 있는 "find"의 복제와 같은 더 우아한 방법이 있습니까?
답변1
문맥상 "인덱스"라고 쓰면 실제로는인덱스 노드. 색인을 의미하는 경우 디렉토리가 색인을 의미한다는 점에 유의하세요.아니요"인덱스 3에 있는 파일을 원합니다"라고 말할 수 있는 잘 정의된 순서의 파일 목록으로 구성됩니다. 디렉토리는 이름별로 색인화됩니다. "I want files names"라고 말합니다 foo
. 디렉토리의 파일 순서는 언제든지 변경될 수 있습니다.
inode를 의미한다고 가정하면 inode를 통해 파일에 액세스할 수 없습니다. 이는 의도적으로 설계된 것입니다. 파일 경로는 권한이 적용되는 방식입니다. inode를 통해 파일에 액세스하면 해당 파일이 포함된 디렉터리에 대한 모든 권한 검사가 무시됩니다. 또한 API에서 요구하기 때문에 inode 번호를 허공에서 가져오는 것이 아니라 설계상 inode 개념이 있는 파일 시스템에서만 가능합니다. 따라서 파일의 inode만 알고 있다면 이름을 찾을 때까지 검색하는 것이 파일을 조작하는 유일한 방법입니다.
inode로 파일을 찾는 방법이 있더라도 문제가 해결되지 않고 약간만 이동될 뿐입니다. find
파일을 찾은 후 작업을 수행하기 전에 이름을 바꾸면 파일 을 투명하게 만듭니다. 그러나 파일을 삭제하고 동일한 inode를 사용하여 다른 파일을 생성하면 find
잘못된 파일에 액세스하게 됩니다.
파일 API는 디렉터리 트리의 원자적 스냅샷을 얻을 수 없습니다. 문제에 대한 솔루션은 여러 가지가 있습니다. 귀하에게 적합한 솔루션은 사용 사례에 따라 다릅니다.
- 작업이 실행되는 트리에 대한 수정 사항을 처리할 수 있는지 확인하세요.
- 작업이 실행되는 동안 디렉터리 트리를 수정하는 모든 응용 프로그램이 일시 중지되었는지 확인하십시오.
- 하위 수준 API를 사용하여 스냅샷을 찍고 (읽기 전용) 스냅샷에 대해 작업합니다. 일부 파일 시스템(예: zfs 및 btrfs)은 볼륨 유형(예: LVM)과 마찬가지로 이 작업을 수행할 수 있습니다.