차이점이 뭐야? 이러한 배포판은 다르게 처리됩니까? 아니면 구성이 다른가요? 무엇을 비교하고 조정해야 합니까? find *
와일드카드 자체를 일치시키고 싶지 않습니다 .
*
하나의 호스트 도 일치 하므로 결과가 다릅니다 .레드햇 호스팅,데비안 호스팅*
검색도 해보세요. 그런데 이름이 없습니다*
.- 플랫폼: Debian Wheezy 7, Red Hat Enterprise Linux 7. 항상 Bash를 사용하세요.
grep
에 있어야 합니다/etc
./etc/hostname
호스트당 하나의 일치 항목만 있을 수 있습니다.데비안 호스팅cat /etc/sysconfig/network
기다리다레드햇 호스팅.
DebianHost# cat $(search /etc/ *) 2>/dev/null | grep $(호스트 이름) 찾기: '*': 해당 파일이나 디렉터리가 없습니다. 데비안 호스팅 데비안호스트# 데비안호스트# 데비안호스트# DebianHost# 호스트 이름 데비안 호스팅 데비안호스트# 데비안호스트# 데비안호스트# 데비안호스트#pwd /뿌리 데비안호스트# 데비안호스트# 데비안호스트# 데비안호스트# ls -1 . 데비안호스트# 데비안호스트# 데비안호스트# DebianHost# grep -r $(호스트 이름) /etc /etc/호스트 이름:DebianHost 데비안호스트# 데비안호스트# 데비안호스트# DebianHost# /etc/ * grep -e “*” 찾기 찾기: '*': 해당 파일이나 디렉터리가 없습니다. 데비안호스트#
RedHatHost# cat $(search /etc/ *) 2>/dev/null | grep $(호스트 이름) 호스트 이름=RedHatHost 레드햇 호스팅# 레드햇 호스팅# 레드햇 호스팅# RedHatHost# 호스트 이름 레드햇 호스팅 레드햇 호스팅# 레드햇 호스팅# 레드햇 호스팅# RedHatHost#pwd /뿌리 레드햇 호스팅# 레드햇 호스팅# 레드햇 호스팅# RedHatHost# ls -1 . 아나콘다-ks.cfg 설치 로그 설치.로그.syslog 레드햇 호스팅# 레드햇 호스팅# 레드햇 호스팅# RedHatHost# grep -r $(호스트 이름) /etc/ /etc/sysconfig/network:HOSTNAME=RedHatHost 레드햇 호스팅# 레드햇 호스팅# 레드햇 호스팅# 레드햇 호스팅# RedHatHost# /etc/ * grep -e “*” 찾기 레드햇 호스팅#
답변1
두 경우 *
모두 쉘에 의해 확장됩니다. 아마도 쉘이 와일드카드를 확장하지 않고 그대로 프로그램에 전달하는 Windows에서 왔을 것입니다. 이는 Unix 쉘이 작동하는 방식이 아닙니다.
이를 확인하는 가장 좋은 방법은 echo *
두 컴퓨터 모두에서 말하는 것입니다. 데비안 컴퓨터에서는 *
파일이 없는 디렉토리에서 실행하고 있으므로 인쇄되므로 *
프로그램에 전달됩니다. (나는 당신이 와일드카드가 아무것도 일치하지 않을 때 호출된 프로그램에 와일드카드를 전달하는 Bash를 실행하고 있다고 가정합니다.) Red Hat 시스템에서는 다음과 같이 말합니다.
anaconda-ks.cfg install.log install.log.syslog
즉, 실행되는 디렉토리에 있는 세 개의 파일 이름이 echo
인수를 구분하는 공백과 함께 인쇄에 전달됩니다.
find /etc/ *
실제로 합리적인 명령이 아니기 때문에 이를 통해 무엇을 달성하고 싶은지 잘 모르겠습니다 find
. /etc
트리의 모든 파일을 나열하고 싶다면 find /etc
그것으로 충분합니다.
답변2
*
인용되지 않은 와일드카드(그 자체가 와일드카드)를 포함하는 경우 다음과 같이 처리됩니다.전반적인 상황그리고 확장됨쉘을 통해이 패턴과 일치하는 파일 목록으로 이동합니다.
이 특정 패턴( *
)은 숨겨지지 않은 파일 이름과 일치하므로 find
셸을 호출하기 전에 현재 디렉터리에 있는 숨겨지지 않은 파일 목록으로 확장됩니다. 따라서 현재 디렉터리에 file 이라는 이름의 파일과 다른 이름의 file 이 포함 되어 foo
있으면 다음 매개변수를 사용하여 호출 foo bar
됩니다 find
.
"find", "/etc/", "foo", "foo bar"
현재 디렉토리에 숨겨지지 않은 파일이 없으면 다른 쉘은 다르게 작동합니다. csh
, tcsh
, fish
, zsh
가 발행됩니다불일치오류 메시지가 표시되고 명령이 실행되지 않습니다. POSIX 셸은 계속 호출되지만 find
모드는 확장되지 않습니다. 따라서 여기서는 find
다음 매개변수를 사용하여 호출이 이루어집니다.
"find", "/etc/", "*"
find
( 및(이 경우 존재하지 않음)에서 모든 파일을 찾아야 합니다 .) 아마도 RedHat에서는 숨김되지 않은 파일이 포함된 디렉터리에서 명령을 호출하는 반면, Debian에서는 숨겨진 파일만 포함된 디렉터리에서 명령을 호출할 것입니다./etc/
*
덧붙여서
cat $(find /etc/ *) 2>/dev/null | grep $(hostname)
틀렸다.
다음과 같이 작성해야 합니다.
find /etc -type f -exec cat {} + | grep -Fe "$(hostname)"
아니면 더 유용할 수도 있습니다:
find /etc -type f -exec grep -Fe "$(hostname)" {} +
또는 Debian과 RedHat 모두 GNU grep을 가지고 있기 때문입니다:
grep -rFe "$(hostname)" /etc
답변3
find /etc *
이름이 인 파일을 찾지 않습니다 *
. 동작 방식은 현재 디렉터리가 비어 있는지 여부에 따라 다릅니다.
- 비어 있으면 쉘이
find /etc *
자체적으로 확장되어find
두 디렉토리를 반복/etc
하고 존재하지 않는다고*
불평합니다*
(아래에 나열된 모든 파일 제외/etc
). 이것이 데비안에서 볼 수 있는 것입니다. - 비어 있지 않으면 쉘이 확장되어 현재 디렉토리의 파일 목록이 이어
find /etc *
집니다 .find /etc
따라서 현재 디렉터리 자체를 제외하고 현재 디렉터리 아래의 모든 파일뿐만 아니라find
아래의 모든 파일이 나열됩니다 ./etc
이것이 RHEL에서 볼 수 있는 것입니다.
차이점은 배포와 관련이 없으며 두 컴퓨터의 서로 다른 컨텍스트에서 테스트하고 있습니다.
이는 이름이 지정된 파일을 찾는 것과 관련이 있습니다 *
. 이름으로 파일을 찾으려면 조건자를 사용해야 합니다 -name
. find /etc -name somename
매개변수는 -name
셸의 와일드카드 패턴과 마찬가지로 와일드카드 패턴입니다. 이 문자 *
는 와일드카드이므로 이름이 인 파일을 찾으려면 *
와일드카드를 백슬래시로 보호해야 합니다 find -name '\*'
. 두 가지 수준의 인용에 유의하세요. 문자 \
및 셸 확장을 방지하기 위한 작은따옴표( 또는 대신 *
사용할 수 있음 )와 패턴 이 "모든 문자 시퀀스"가 아닌 "리터럴"이 되도록 백슬래시를 사용합니다 .find -name "\\*"
find -name \\\*
find
\*
*
*
파일 이름에는 유효하지만 일반적이지 않은 문자입니다. 이름이 인 문자를 실제로 일치시키지 않고 *
모든 파일을 일치시키려는 경우에는 쓸 수 있지만 (다시 말하지만 셸이 확장하지 않도록 find /etc -name '*'
인용해야 합니다 ) 와 동일하지 않습니다 .*
find /etc
보다 정확하게는 현재 디렉터리에 도트 파일 이외의 파일이 포함되어 있는지 여부, 즉 이름이 로 끝나지 않는 파일이 포함되어 있는지 여부입니다 .
.