find *는 Debian에서는 "*"라는 파일을 찾지만 RHEL에서는 찾지 않습니다.

find *는 Debian에서는 "*"라는 파일을 찾지만 RHEL에서는 찾지 않습니다.

차이점이 뭐야? 이러한 배포판은 다르게 처리됩니까? 아니면 구성이 다른가요? 무엇을 비교하고 조정해야 합니까? 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

보다 정확하게는 현재 디렉터리에 도트 파일 이외의 파일이 포함되어 있는지 여부, 즉 이름이 로 끝나지 않는 파일이 포함되어 있는지 여부입니다 ..

관련 정보