파일 시스템의 모든 로컬 파일을 찾기 위해 크로스 플랫폼 명령줄을 작성하려고 합니다.
find
내 의도는 POSIX 매개변수만 사용하여 이 명령을 사용하는 것입니다 . POSIX 명령으로 제한되고 프로그래밍 없이 원격 파일 시스템의 파일을 건너뛸 수 있는 방법이 있습니까?
내 현재 명령줄은 다음과 같습니다.
find -type f -print
그러나 이것은 분명히 로컬 파일뿐만 아니라 모든 일반 파일을 나열합니다.
나는 이 -local
플래그를 알고 있지만 내가 아는 한 그것은 POSIX 또는 크로스 플랫폼 표준의 다른 부분의 일부가 아닙니다. locate
크로스 플랫폼도 아닌 것 같습니다. 나는 또한 -xdev
로컬에 마운트된 모든 파일 시스템을 검색하고 싶기 때문에 그 플래그가 내가 찾고 있는 것이라고 생각하지 않습니다 . /
와 /home
둘 다 로컬이고 내가 실행하는 find / -xdev -print
경우 find
건너뛰어야 합니다 /home
(뭔가 오해하지 않는 한).
그만한 가치가 있는 경우 다음 URL이 유용한 리소스입니다.
답변1
POSIX 인터페이스만 사용하여 파일 시스템이 원격인지 로컬인지 확인할 수 있는 방법은 없다고 생각합니다. POSIX는 명령을 시행하지도 않으며 mount
내가 아는 한 파일 시스템에 대한 모든 참조는 "구현 정의"라는 용어로 채워져 있습니다.
-local
명령의 본문은 find
Solaris에서만 사용할 수 있고 원격 파일 시스템 유형을 나열하는 구성 파일의 존재 여부에 따라 달라지므로 그다지 유용하지 않습니다.
POSIX는 명령을 시행하며 df
명령이 플래그와 함께 사용되는 경우 특정 출력 형식이 필요합니다 -P
. 해당 형식에는 공백으로 구분된 6개의 필드가 있으며 그 중 첫 번째는 "구현에서 파일 시스템의 이름입니다. -정의된 형식", 마지막 것은 마운트 지점입니다.
필요한 것은 로컬 파일 시스템에 해당하는 모든 마운트 지점 목록입니다. 여기서는 원격 파일 시스템과 "닮아 보이는" 파일 시스템 이름을 제외하는 경험적 방법을 사용해야 한다고 생각합니다. 몇 가지 예:
//... CIFS (Samba)
host:... NFS
/afs AFS
이는 완전한 목록이 아니며 전혀 보장할 수 없습니다.
그런 다음 출력에서 이러한 행을 필터링 하고 처음 5개 열을 제거하면 마스터 목록을 사용하여 명령 df
에 목록을 제공할 수 있습니다 .find
-xdev
이것이 그럴듯하게 들리더라도 파일 시스템이 실제로 "마운트"(AFS 참조)되거나 파일 시스템이 완전히 로컬이거나 완전히 원격이라는 것을 실제로 보장할 수는 없습니다(회로 기반 파일 시스템은 단일 파일을 임의로 리디렉션할 수 있음). 그래서 제가 조언하는 것은 조심해서 진행하라는 것입니다.
답변2
이것은 -xdev
작동하지만 아마도 원하는 방식이 아닐 수도 있습니다.POSIX
find
남성: find -xdev
다른 FS가 발견될 때까지 실행합니다 ( 유틸리티 또는 시스템 호출을 사용하여 확인할 Device ID
수 있음 ).stat
stat()
예를 들어 linux
:
# stat /home/foo
File: `/home/foo'
. . .
Device: fd02h/64770d
. . .
# stat /boot/foo
File: `/boot/foo'
. . .
Device: 801h/2049d
. . .
다음을 통해 찾아보자 -xdev
:
# find / -xdev -name foo -print
#
아니요:
# find / -name foo -print
/home/foo
/boot/foo
확인하다 Device ID
:Solaris
# truss -t lstat64 -v lstat64 ls /foo
lstat64("/foo", 0xFFBFFC48)
d=0x02580000 . . .
# truss -t lstat64 -v lstat64 ls /etc/foo
lstat64("/etc/foo", 0xFFBFFB88)
d=0x02580000 . . .
# truss -t lstat64 -v lstat64 ls /opt/foo
lstat64("/opt/foo", 0xFFBFFC48)
d=0x02580004 . . .