Diferença entre o comando 'ls -ltr abc *' e 'find ./ -name abc *'? [duplicado]

2
    

Esta pergunta já tem uma resposta aqui:

    

Para pesquisar um arquivo em um diretório, encontrei dois comandos abaixo:

  • ls -ltr nome do arquivo inicial *
  • encontre ./ -name initialfilename *

Às vezes, o primeiro comando me dá o resultado da pesquisa, mas às vezes eu costumava executar o segundo comando. Qual é a diferença entre esses dois conjuntos de comandos do Linux? Por favor, especifique sua resposta apenas em torno da principal diferença.

    
por ursitesion 21.04.2015 / 09:20

5 respostas

5
  • ls -ltr file* : Esse comando apenas lista o conteúdo do diretório atual no formato de listagem longo ( -l ), classificado pelo tempo de modificação ( -t ) na ordem inversa ( -r ) de todos arquivos e diretórios que começam com file* .

  • find ./ -name file* : Esse comando pesquisa toda a estrutura de diretórios no diretório de trabalho atual e todos os seus subdiretórios para arquivos e diretórios que começam com file* em seus nomes. O formato de saída é muito simples; somente os caminhos file / dir são impressos linha por linha.

Grande diferença (conclusão): ls aplica-se apenas ao diretório de trabalho atual, enquanto find se aplica a todos os arquivos e subdiretórios a partir do diretório de trabalho atual.

    
por 21.04.2015 / 09:31
3

A versão find também encontrará arquivos correspondentes a esse nome em subdiretórios.

Note que você deve citar ou escapar do * no padrão do nome do arquivo; se o padrão corresponder a um arquivo no diretório local, ele se expandirá para esse nome e find encontrará exatamente esse nome. Se corresponder a mais de um nome de arquivo, você receberá um erro, porque esses vários nomes de arquivos substituirão o padrão na invocação find e não corresponderão à sintaxe find . Por exemplo:

$ 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
    
por 21.04.2015 / 09:32
2

O shell fará a expansão do nome do arquivo antes que qualquer comando seja executado, portanto, os resultados dependerão do que está no diretório atual.

Para conseguir o que você quer, eu acho que você gostaria de citar o * no comando find. verifique este exemplo.

$# 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$

    
por 21.04.2015 / 10:29
0

ls -ltr listará o arquivo se ele existir no diretório atual. find irá procurar o arquivo recursivamente (irá procurar pelo arquivo nos subdiretórios)

    
por 21.04.2015 / 09:30
0

O comando find falhará se o initialfilename* se expandir para mais de um arquivo:

$ 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]

É por isso que você deve escapar do asterisco:

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

$ find . -name initial\*
./initiala
./initialb
    
por 21.04.2015 / 10:19