"ls -ltr abc*"와 "find ./ -name abc*" 명령의 차이점은 무엇입니까? [복사]

"ls -ltr abc*"와 "find ./ -name abc*" 명령의 차이점은 무엇입니까? [복사]

디렉토리에서 파일을 검색하기 위해 다음과 같은 두 가지 명령을 찾았습니다.

  • ls -ltr 초기 파일 이름*
  • ./ -name 초기 파일 이름 찾기*

때로는 첫 번째 명령으로 검색 결과를 얻을 수도 있지만 때로는 두 번째 명령을 실행하기도 했습니다. 이 두 Linux 명령 세트의 차이점은 무엇입니까? 주요 차이점에 대해서만 답변을 명시해 주십시오.

답변1

  • ls -ltr file*: 이 명령은 단순히 현재 디렉터리의 내용을 긴 목록 형식( )으로 나열 하고 -l, ( ) 로 시작하는 모든 파일과 디렉터리를 -t수정 시간( )을 기준으로 역순( )으로 정렬합니다 .-rfile*

  • find ./ -name file*: 이 명령은 현재 작업 디렉터리 아래의 전체 디렉터리 구조와 모든 하위 디렉터리에서 이름이 로 시작하는 파일과 디렉터리를 검색합니다 file*. 출력 형식은 매우 간단합니다. 파일/디렉토리 경로를 한 줄씩 인쇄합니다.

주요 차이점(결론): ls현재 작업 디렉터리에만 적용되지만 find현재 작업 디렉터리에서 시작하는 모든 파일 및 하위 디렉터리에 적용됩니다.

답변2

find버전은 또한 해당 이름과 일치하는 파일을 하위 디렉터리에서 찾습니다.

*파일 이름 패턴을 인용하거나 이스케이프해야 합니다. 패턴이 로컬 디렉터리의 파일과 일치하면 해당 이름으로 확장되어 find해당 이름만 정확하게 찾습니다. 여러 파일 이름과 일치하면 이러한 여러 파일 이름이 find호출의 패턴을 대체하고 구문과 일치하지 않기 때문에 오류가 발생합니다 find. 예를 들어:

$ cd /etc
$ find . -name pass*
find: paths must precede expression: passwd-
Usage: find [-H] [-L] [-P] [-Olevel] [-D help|tree|search|stat|rates|opt|exec] [path...] [expression]
$ find . -name 'pass*'
./passwd
./passwd-
./pam.d/passwd
./cron.daily/passwd

답변3

쉘은 명령을 실행하기 전에 파일 이름 확장을 수행하므로 결과는 현재 디렉토리의 내용에 따라 달라집니다.

*원하는 것을 얻으려면 find 명령을 인용하고 싶을 것입니다. 이 예를 확인하세요.

# First show all the files
~/tmp/stack $ find .
.
./dir1
./dir1/FileA
./dir1/FileB
./dir1/FileC
./dir1/filec
./dir2
./dir2/filea
./dir2/fileb

# Following will list nothing because there is no file named File* in the current directory
~/tmp/stack $ ls -lR File*
ls: cannot access File*: No such file or directory

# Now using find will work because no file named File* exists, file name 
# expansion fails, so find sees the * on the command line.
~/tmp/stack $ find . -name File*
./dir1/FileA
./dir1/FileB
./dir1/FileC

# I'll create a file named Filexxx
~/tmp/stack $ touch Filexxx

# ls will work but only list details for Filexxx
~/tmp/stack $ ls -lR File*
-rw-rw-r-- 1 christian christian 0 Apr 21 09:08 Filexxx

# and so will find but probably not as expected because filename expansion works, so actual command executed is find . -name Filexxx
~/tmp/stack $ find . -name File*
./Filexxx

# now escape the wild card properly, then find will work as expected
~/tmp/stack $ find . -name File\*
./dir1/FileA
./dir1/FileB
./dir1/FileC
./Filexxx
~/tmp/stack

답변4

findinitialfilename*두 개 이상의 파일로 확장 되면 명령이 실패합니다.

$ touch initiala initialb
$ dir -lrt initial*
-rw-rw-rw-  1 user 0 0 2015-04-21 10:17 initialb
-rw-rw-rw-  1 user 0 0 2015-04-21 10:17 initiala
$ find . -name initial*
find: paths must precede expression: initialb
Usage: find [-H] [-L] [-P] [-Olevel] [-D help|tree|search|stat|rates|opt|exec] [path...] [expression]

이것이 별표를 피해야 하는 이유입니다.

$ find . -name "initial*"
./initiala
./initialb

$ find . -name initial\*
./initiala
./initialb

관련 정보