为了搜索目录中的文件,我找到了两个命令,如下所示:
- ls -ltr 初始文件名*
- 查找 ./ -name 初始文件名*
有时,第一个命令会给我搜索结果,但有时我曾经执行第二个命令。这两套Linux命令有什么区别?请仅针对主要差异指定您的答案。
答案1
ls -ltr file*
:该命令只是以长列表格式( )列出当前目录的内容-l
,按修改时间(-t
)倒序(-r
)排序以 开头的所有文件和目录file*
。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
shell 将在执行任一命令之前进行文件名扩展,因此结果取决于当前目录中的内容。
*
为了得到你想要的,我想你会想要在 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
find
如果initialfilename*
扩展到多个文件,该命令将失败:
$ 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