Considere um diretório com os seguintes arquivos:
file1
file1.suffix
file2
file3
file3.suffix
Preciso listar todos os arquivos de forma que não exista outro arquivo com o mesmo nome e um sufixo conhecido. No exemplo acima, isso corresponderia apenas a file2
.
Isto é o que eu vim com:
diff --new-line-format= --unchanged-line-format= \
<(ls -I '*.suffix' | sort) \
<(ls *.suffix | sed 's/\(.*\)\.suffix/\1/' | sort)
Existe uma maneira mais simples e mais curta?
Editar 1
No meu caso concreto, existem vários sufixos (bind zone files /w dnssec):
example.org
example.org.jbk
example.org.jnl
example.org.signed
example.org.signed.jnl
example.com
Estou tentando listar zonas que não possuem dnssec habilitado, ou seja, arquivos que não possuem outro arquivo com .signed
extensão.
Esta é a minha tentativa:
diff --new-line-format= --unchanged-line-format= \
<(ls -I '*.jbk' -I '*.jnl' -I '*.signed' -I '*.signed.jnl' | sort) \
<(ls *.signed | sed 's/\(.*\)\.signed/\1/' | sort)
Com
zsh
:(ou use
^*.*
em vez de^*.suffix
se quiser considerar apenas os arquivos sem extensão ou, após a atualização da sua pergunta*.(org|net|com)
ou^*.*.*
ou^*.(signed|jnl|jbk)
...)Isso é listar os não-
.suffix
arquivos, para os quaisfile.suffix
não existem, usando oe
qualificador glob para selecionar arquivos com base nae
valoração de algum código (onde$REPLY
contém o caminho do arquivo a ser selecionado).Outra abordagem usando o
${a:|b}
operador de subtração de array (mnemônico: elementos dea
bar os deb
):ls -ld --
é usado apenas como um comando de exemplo aqui, você pode usar qualquer outro comando ou armazenar a lista em uma matriz como:Como sua lista de arquivos atual tem uma convenção de nomenclatura simples - aqui está uma breve abordagem
ls
+cut
+uniq
:Não sei se mais curto, mas diretamente no shell (Bash e zsh testados rapidamente):
(ou substitua
echo
por algo sensato)Ou o mesmo com vários sufixos: