Por exemplo, estou procurando arquivos e diretórios em algum diretório:
ubuntu@example:/etc/letsencrypt$ sudo find . -name example.com*
./archive/example.com
./renewal/example.com.conf
./live/example.com
ubuntu@example:/etc/letsencrypt$
Como posso marcar isso ./archive/example.com
e ./live/example.com
os diretórios estão na saída acima?
Responder1
Imprima o tipo de arquivo junto com o nome com -printf "%y %p\n"
:
$ sudo find . -name 'example.com*' -printf "%y %p\n"
d ./archive/example.com
f ./renewal/example.com.conf
d ./live/example.com
O uso de -printf
assume GNU find
(a implementação mais comum find
em sistemas Linux).
Responder2
Encontre duas vezes:
echo 'directories'
find . -name 'example.com*' -type d
echo 'non-directories'
find . -name 'example.com*' ! -type d
Observe também a citação do padrão usado para o teste de nome. Sem aspas, o shell tentaria comparar a string com os nomes no diretório atual antes de chamar find
. Se a failglob
opção shell fosse definida no bash
shell, ou se a NOMATCH
opção shell zsh
não fosse desativada, um padrão globbing sem aspas que não correspondesse a nada geraria um erro no shell e find
não seria chamado.
Como alternativa, basta exibir uma barra no final dos nomes dos caminhos dos diretórios (é assim que ls -p
representaria os diretórios):
find . -name 'example.com*' \( -type d -exec printf '%s/\n' {} \; -o -print \)
O comando acima find
testa primeiro se o nome está correto. Se for, e for um diretório, ele chama printf
para gerar o nome do caminho do diretório com uma barra no final. Se não for, um diretório -print
será usado apenas para gerar o nome do caminho como está.
Com o GNU find
, o -exec printf '%s/\n' {} \;
bit poderia ser substituído por -printf '%p/\n'
.
Com standard find
, você também pode -exec printf '%s/\n' {} +
chamar o printf
utilitário externo o menor número de vezes possível, mas isso significaria que os diretórios provavelmente seriam gerados por último, ou pelo menos em lotes.
Outra alternativa é realmente usar ls -p
para diferenciar os diretórios de outros tipos de arquivo. Usando ls -p
, um diretório seria listado com um /
caractere final, assim como acima.
find . -name 'example.com*' -exec ls -f -d -p {} +
Estou usando -f
aqui para evitar ls
classificar a saída e -d
evitar listar oconteúdode diretórios.
Você poderia usar ls -F
em vez de ls -p
também colocaroutromarcas em tipos de arquivos diferentes de diretórios. Por exemplo, os executáveis teriam o sufixo de *
e os links simbólicos teriam o sufixo de @
.
Ambos -p
e -F
(e -f
e -d
) são opções padrão para o ls
utilitário.
Responder3
Você pode usar file
assim:
sudo find . -name "example.com*" -print0 | xargs -0 sudo file
Exemplo de saída:
$ sudo find . -name "example.com*" -print0 | xargs -0 sudo file
./example.com. big file: ASCII text
./example.com-dir: directory
./example.com: empty
Responder4
Se você deseja uma opção mais portátil que funcione com sabores *nix sem a -printf
opção gnu (macOS, por exemplo), você pode adicionar uma barra no final dos caminhos de diretório da ls
seguinte forma:
find . -name "example.com*" -exec ls -dF {} \;
exemplo:
$ sudo find . -name "example.com*" -exec ls -dF {} \;
./archive/example.com/
./renewal/example.com.conf
./live/example.com/
Isso também está em um formato mais adequado para canalização adicional para mais comandos unix.