Considere o seguinte exemplo:
mkdir /tmp/test2 && cd /tmp/test2
mkdir -p aa/{tmp,src}
mkdir -p bb/aa/{tmp,src}
mkdir -p {dd,ee}/bb
touch {dd,ee}/bb/aa
tree | awk '{print "# " $0}'
# .
# ├── aa
# │ ├── src
# │ └── tmp
# ├── bb
# │ └── aa
# │ ├── src
# │ └── tmp
# ├── cc
# │ └── aa
# │ ├── src
# │ └── tmp
# ├── dd
# │ └── bb
# │ └── aa
# └── ee
# └── bb
# └── aa
#
# 16 directories, 2 files
Então, quero encontrar todos os itens chamados aa
, e imprimi-los no mesmo formato que ls -la
, para poder ver se são arquivos ou diretórios.
Se eu fizer o típico find
with exec
of ls -a
- então os diretórios em si não serão impressos como itens, mas sim seus conteúdos:
$ find . -name aa -exec ls -la {} \;
total 0
drwxr-xr-x 1 user None 0 Feb 19 11:59 .
drwxr-xr-x 1 user None 0 Feb 19 12:00 ..
drwxr-xr-x 1 user None 0 Feb 19 11:59 src
drwxr-xr-x 1 user None 0 Feb 19 11:59 tmp
total 0
drwxr-xr-x 1 user None 0 Feb 19 11:59 .
drwxr-xr-x 1 user None 0 Feb 19 11:59 ..
drwxr-xr-x 1 user None 0 Feb 19 11:59 src
drwxr-xr-x 1 user None 0 Feb 19 11:59 tmp
total 0
drwxr-xr-x 1 user None 0 Feb 19 11:59 .
drwxr-xr-x 1 user None 0 Feb 19 11:59 ..
drwxr-xr-x 1 user None 0 Feb 19 11:59 src
drwxr-xr-x 1 user None 0 Feb 19 11:59 tmp
-rw-r--r-- 1 user None 0 Feb 19 12:00 ./dd/bb/aa
-rw-r--r-- 1 user None 0 Feb 19 12:00 ./ee/bb/aa
Se eu usar ls -lad {}/
isso, imprimo explicitamente apenas os nós do diretório, então os nós do arquivo não são impressos, mas recebo um erro "Não é um diretório":
$ find . -name aa -exec ls -lad {}/ \;
drwxr-xr-x 1 user None 0 Feb 19 11:59 ./aa/
drwxr-xr-x 1 user None 0 Feb 19 11:59 ./bb/aa/
drwxr-xr-x 1 user None 0 Feb 19 11:59 ./cc/aa/
ls: cannot access './dd/bb/aa/': Not a directory
ls: cannot access './ee/bb/aa/': Not a directory
Se eu tentar algum tipo de bash
condicional diretamente na linha de comando, ele falha:
# test
$ [ -d aa ] && echo dir || echo file
dir
$ find . -name aa -exec [ -d {} ] && ls -lad {}/ || ls -la {} \;
find: missing argument to `-exec'
ls: cannot access '{}': No such file or directory
ls: cannot access ';': No such file or directory
Então, como posso usar find . -name aa
, para que eu obtenha esta saída:
drwxr-xr-x 1 user None 0 Feb 19 11:59 ./aa/
drwxr-xr-x 1 user None 0 Feb 19 11:59 ./bb/aa/
drwxr-xr-x 1 user None 0 Feb 19 11:59 ./cc/aa/
-rw-r--r-- 1 user None 0 Feb 19 12:00 ./dd/bb/aa
-rw-r--r-- 1 user None 0 Feb 19 12:00 ./ee/bb/aa