Parâmetros do comando find

1

Que diferença faz quando usamos os parâmetros -print e -depth no comando find , dado que eles produzem o mesmo resultado:

/home/pkaramol/Desktop/testdir
$ find . 
.
./testfile3.txt
./testfile1.txt
./testfile4.txt
./testdir1
./testfile2.txt
./testdir2
/home/pkaramol/Desktop/testdir
$ find . -depth 
./testfile3.txt
./testfile1.txt
./testfile4.txt
./testdir1
./testfile2.txt
./testdir2
.
/home/pkaramol/Desktop/testdir
$ find . -depth -print
./testfile3.txt
./testfile1.txt
./testfile4.txt
./testdir1
./testfile2.txt
./testdir2
.
    
por pkaramol 25.02.2018 / 11:49

1 resposta

10

-print garantirá que o nome do caminho atual seja impresso na saída padrão. Alguns sinalizadores desativam a impressão padrão de nomes de caminho ( -exec , por exemplo).

-depth causará uma passagem em profundidade da hierarquia de arquivos, para que os nomes de caminhos nos diretórios sem subdiretórios sejam tratados primeiro (de baixo para cima e não de cima para baixo). No seu exemplo, faz pouca diferença ao trabalhar no diretório sem subdiretórios, mas observe que . é reportado após os outros nomes de caminho quando você usa -depth (isso é porque . é o diretório mais importante a ser pesquisado, portanto, seu nome de caminho é tratado por último com -depth e primeiro sem -depth ).

É útil usar -depth se um estiver excluindo diretórios com find , pois você obterá erros ao tentar acessar diretórios já excluídos sem ele.

Como Scott aponta nos comentários abaixo, você definitivamente precisa de -depth quando renomeia diretórios também, ou você potencialmente não seria capaz de percorrer a estrutura de diretórios em ao mesmo tempo que você está renomeando diretórios nele.

O sinalizador -delete ativa -depth por padrão.

Exemplo: Exclua todos os diretórios abaixo do diretório atual cujos nomes correspondam a *deleteme (por exemplo, folder-deleteme ) e imprima os caminhos para os diretórios excluídos com êxito:

find . -depth -type d -name '*deleteme' -exec rm -rf {} ';' -print

Dada a seguinte estrutura de diretório,

$ tree
.
'-- folder-deleteme
    '-- another-deleteme
        '-- evenmore-deleteme

3 directories, 0 file

executar o comando find acima sem -depth resultaria em

$ find . -type d -name '*deleteme' -exec rm -rf {} ';' -print
./folder-deleteme
find: ./folder-deleteme: No such file or directory

porque find exclui o diretório mais alto folder-deleteme (e imprime seu caminho) e, em seguida, tenta inseri-lo para procurar mais diretórios para excluir.

Além disso:

$ find .
.
./folder-deleteme
./folder-deleteme/another-deleteme
./folder-deleteme/another-deleteme/evenmore-deleteme

$ find . -depth
./folder-deleteme/another-deleteme/evenmore-deleteme
./folder-deleteme/another-deleteme
./folder-deleteme
.
    
por 25.02.2018 / 11:53

Tags