./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'
-print
find foo/bar -name file -printf '%P\n'
find . -name file -printf '%P\n'
dir/file
foo/bar/dir/file
./dir/file
보다 일반적으로 ./
접두사는 오류를 방지하는 데 도움이 될 수 있으므로예를 들어예를 들어 파일 이름이 대시로 시작하는 경우 파일 이름 -f
이 rm -f
삭제되지는 않지만 rm ./-f
삭제됩니다.
셸 또는 exec*p()
표준 C 함수(및 다른 언어의 해당 기능)를 사용하여 명령을 실행할 때 명령 이름에 가 포함되어 있지 않으면 명령 경로 가 상대 경로(현재 작업 디렉터리)로 해석되는 대신 /
조회됩니다. $PATH
). 여러 쉘 /특수 내장 함수 (POSIX 호환 구현 포함) 에 대한 .
인수 에도 동일하게 적용됩니다. 이 경우 동일한 상대 경로를 지정하는 또 다른 방법인 대신 을 사용하십시오. 그러나 a를 사용하는 것은 일반적으로 현재 작업 디렉토리에 저장된 명령을 호출하는 방법입니다.source
sh
./cmd
cmd
/
답변2
일반 파일에 관해 이야기할 때 실제적인 용도는 없습니다. 그러나 실행 파일에 관해 이야기할 때는 의미가 있습니다. 실행하는 경우( file1
현재 디렉터리에 있는 경우):
file1
쉘은 PATH 변수의 모든 경로에서 실행 파일을 검색합니다. 이 파일은 PATH에 다음과 같은 항목이 있는 경우에만 실행됩니다( :.:
현재 디렉터리가 PATH 검색에 있음). 매우 현명하지 못한 설정 대신 다음 file1
을 통해 현재 디렉터리에서 실행할 수 있습니다 .
./file1
답변3
Linux의 많은 명령은 -
stdin을 나타내는 특수 파일로 수신되므로 이름이 실제로 stdin인 파일을 나타내려면 를 -
사용해야 합니다 ./-
.
또한 매개변수의 경우 like로 시작하는 파일 이름을 -
사용하려면 를 사용해야 합니다 .-
--file
./--file
-
grep -e --pattern
"-"라는 이름의 파일을 "빼는" 방법은 무엇입니까?