상대 파일 경로("find" 출력에서) 앞에 있는 "./"의 실제 용도는 무엇입니까?

상대 파일 경로("find" 출력에서) 앞에 있는 "./"의 실제 용도는 무엇입니까?

./file일부 상대 파일 경로가 가 아닌 으로 나타나는 이유는 무엇입니까 file? 예를 들어, 다음과 같이 할 때:

find .

나는 다음과 같은 결과를 얻습니다.

./file1
./file2
./file3

도로를 더욱 혼란스럽게 만드는 것 외에 실제 목적은 무엇입니까? 몇 번의 사고를 예방할 수 있었던 것은 아닙니다. 둘 다 상대 경로이며 cat ./file1동일한 방식으로 작동합니다 cat file1.

find이 동작은 명령이나 일부 시스템 전체 C 라이브러리 에서 발생합니까 ?

./file좋아요, 왜 for 생성자를 사용해야 하는지 이해합니다 ( 대신 -exec가 있는지 확인하기 위해 ).... | xargs rm ./-i... | xargs rm -i

그러나 어떤 상황에서 진술 ./이 없으면 -print문제가 발생합니까?

나는 뭔가를 깨뜨리는 문장을 만들려고 노력하고 있습니다.

touch -- -b -d -f -i
find -printf '%P\n' | sort

-b
-d
-f
-i

모든 것이 정상입니다.

궁금해서 -print이 문제를 증명하는 진술을 어떻게 구성할 수 있을까요?

답변1

이 동작은 에서 발생 find하며POSIX에 의해 지정됨:

후행 <슬래시> 문자를 포함하여 피연산자는 제공된 대로 평가되어야 합니다. 계층 구조에서 발견되는 다른 파일에 대한 모든 경로 이름에는 현재 파일의 연결이 포함되어야 합니다.피연산자, 현재 경로 피연산자가 1로 끝나지 않는 경우 <슬래시>피연산자.

기본 조치는 -print전체 경로 이름을 표준 출력으로 인쇄하는 것입니다.

find명령줄에 지정된 경로부터 시작하여 찾은 파일의 경로를 출력합니다.

find .

및 하위 디렉터리에서 파일을 find찾고 ;로 시작하는 결과를 표시하도록 요청했습니다 .../

find foo

같은 일을 할 것이지만 처음부터 foo, 그리고 처음부터 결과를 만들어 낼 것입니다 foo/.

find특별히 예방하기 위한 것은 아닌 것 같아요질문파일 이름에는 접두사가 붙지 않습니다. 대신 일관성을 위해 그렇게 합니다. 인수로 제공된 경로에 관계없이 의 출력은 -print항상 해당 경로에서 시작됩니다.

GNU 구현을 사용하면 대신 in을 사용하여 find인쇄 파일의 시작 부분에서 초기 경로를 제거할 수 있습니다. 예를 들어, or를 사용하면 이러한 파일에 대한 대안인 or를 얻을 수 있습니다.-printf '%P\n'-printfind foo/bar -name file -printf '%P\n'find . -name file -printf '%P\n'dir/filefoo/bar/dir/file./dir/file

보다 일반적으로 ./접두사는 오류를 방지하는 데 도움이 될 수 있으므로예를 들어예를 들어 파일 이름이 대시로 시작하는 경우 파일 이름 -frm -f삭제되지는 않지만 rm ./-f삭제됩니다.

셸 또는 exec*p()표준 C 함수(및 다른 언어의 해당 기능)를 사용하여 명령을 실행할 때 명령 이름에 가 포함되어 있지 않으면 명령 경로 가 상대 경로(현재 작업 디렉터리)로 해석되는 대신 /조회됩니다. $PATH). 여러 쉘 /특수 내장 함수 (POSIX 호환 구현 포함) 에 대한 .인수 에도 동일하게 적용됩니다. 이 경우 동일한 상대 경로를 지정하는 또 다른 방법인 대신 을 사용하십시오. 그러나 a를 사용하는 것은 일반적으로 현재 작업 디렉토리에 저장된 명령을 호출하는 방법입니다.sourcesh./cmdcmd/

답변2

일반 파일에 관해 이야기할 때 실제적인 용도는 없습니다. 그러나 실행 파일에 관해 이야기할 때는 의미가 있습니다. 실행하는 경우( file1현재 디렉터리에 있는 경우):

file1

쉘은 PATH 변수의 모든 경로에서 실행 파일을 검색합니다. 이 파일은 PATH에 다음과 같은 항목이 있는 경우에만 실행됩니다( :.:현재 디렉터리가 PATH 검색에 있음). 매우 현명하지 못한 설정 대신 다음 file1을 통해 현재 디렉터리에서 실행할 수 있습니다 .

./file1

답변3

Linux의 많은 명령은 -stdin을 나타내는 특수 파일로 수신되므로 이름이 실제로 stdin인 파일을 나타내려면 를 -사용해야 합니다 ./-.

또한 매개변수의 경우 like로 시작하는 파일 이름을 -사용하려면 를 사용해야 합니다 .---file./--file-grep -e --pattern"-"라는 이름의 파일을 "빼는" 방법은 무엇입니까?

관련 정보