Diga ao find
que você está interessado apenas em arquivos, não em diretórios.
find ./foo -type f ! -name test.txt
Atualização:
Suponha que tenhamos um exemplo um pouco mais complexo:
$ find ./foo
./foo
./foo/baz
./foo/baz/b.csv
./foo/baz/a.txt
./foo/bar
./foo/bar/c.txt
./foo/bar/world
./foo/bar/world/hello.txt
./foo/bar/world/test.txt
Se o seu objetivo é excluir as coisas, você precisa especificar -depth
para que os arquivos sejam vistos antes de seus diretórios:
$ find ./foo -depth
./foo/baz/b.csv
./foo/baz/a.txt
./foo/baz
./foo/bar/c.txt
./foo/bar/world/hello.txt
./foo/bar/world/test.txt
./foo/bar/world
./foo/bar
./foo
Se você souber o caminho que deseja manter, poderemos criar uma expressão regular que corresponda a bits dela:
$ find ./foo -depth -regextype posix-extended -regex '^\./foo(/bar(/world(/test.txt)?)?)?'
./foo/bar/world/test.txt
./foo/bar/world
./foo/bar
./foo
Então, podemos negar o regex para obter o material que você deseja remover:
$ find ./foo -depth -regextype posix-extended ! -regex '^\./foo(/bar(/world(/test.txt)?)?)?'
./foo/baz/b.csv
./foo/baz/a.txt
./foo/baz
./foo/bar/c.txt
./foo/bar/world/hello.txt