Comando Find obter arquivo ou diretório

1

Eu estou tentando escrever um comando de busca que encontre tanto arquivos quanto diretórios, o problema é que eu só obtenho arquivos ou erro dependendo de certas variáveis no comando.

Este comando não produz nada:

find '/mnt/downloads/cache/' -depth -mindepth 1 \( -type f ! -exec fuser -s {} \; \) -o \( -type d -empty \) -print

Isso ocorre porque os dois filtros não são encapsulados em (). Por que são necessárias aspas duplas?

Este comando gera apenas arquivos, mas não diretórios:

find '/mnt/downloads/cache/' -depth -mindepth 1 \( \( -type f ! -exec fuser -s {} \; \) -o \( -type d -empty \) \) -print

Um conjunto extra de colchetes que encapsulam os dois argumentos é a única diferença.

A última variação do comando resulta em um erro:

find '/mnt/downloads/cache/' -depth -mindepth 1 \( \( -type f ! -exec fuser -s {} \; \) -o \( -type d -empty {} \) \) -print

find: paths must precede expression: {}

Por que adicionar um segundo conjunto de {} após os resultados do teste diretory nesse erro?

Comando fixo:

find "/mnt/downloads/cache" -depth -mindepth 1 \( \
-type f \! -exec fuser -s '{}' \; -o \
-type d \! -empty \) \
-print
    
por DominicM 09.12.2017 / 14:24

1 resposta

1

Como o implícito e ( -a ) tem precedência mais alta que o -o , o lado direito do -o na primeira expressão é tomado como uma unidade em relação ao Operação ou , isto é:

\( -type f ! -exec fuser -s {} \; \) -o \( -type d -empty \) -print

age da mesma forma:

\( -type f ! -exec fuser -s {} \; \) -o \( -type d -empty -print \)

Portanto, para arquivos, ele executa fuser e, para diretórios, ele imprime seus nomes.

O segundo:

\( \( -type f ! -exec fuser -s {} \; \) -o \( -type d -empty \) \) -print

tem parênteses explícitos, mas você não precisa dos internos, isso é igual:

\( -type f ! -exec fuser -s {} \;  -o  -type d -empty  \) -print

E ele deve imprimir todos os diretórios e arquivos vazios para os quais fuser retorna um valor falso (! = 0, invertido pelo ! ).

No terceiro, você tem ... -empty {} ... , em que {} é usado como nome do caminho e a mensagem de erro informa qual é o problema.

    
por 09.12.2017 / 15:16