Quero excluir todos os arquivos que têm um arquivo C
correspondente . Todos os arquivos de montagem têm no final. Os arquivos têm nomes idênticos, mas com em vez de no final. Como eu faria algo como:asm
_x86_64.S
C
.c
_x86_64.S
find . -not -name *{_x86_64.S but replace with .c}
Então, por exemplo, se my_func.c
e my_func_x86_64.S
existirem, o arquivo my_func.c
será excluído pelo comando acima.
Editar: A resposta fornecida abaixo funciona. Esqueci de mencionar que estava usando isso em um Makefile. O que eu estava fazendo era o seguinte:
ASM_FILES = $(shell find ./src/assembly/x86_64/ -name "*.S" -printf "-not -name \"*%f*\" -and ")
ASM_INCLUDE += -wholename "./src/assembly/x86_64/*.S" -or
EXCLUDE += $(subst _x86_64.S,.c,$(ASM_FILES))
Isso funciona, mas eu esperava algo um pouco mais limpo.
Bem, algo como
[ -e "${1%.c}.asm" ]
testaria se o.c
arquivo nomeado pelo primeiro argumento da linha de comando tem um.asm
.Então, lembrando que find
-exec
é uma condição, isso pode ser usado para imprimir todos.c
os arquivos sem um.asm
.Então, teremos que incluir todo o resto (supondo que você queira apenas arquivos regulares), por exemplo:
por exemplo, dados os quatro arquivos
bar.c foo.asm foo.c hello.txt
, que imprimeEmbora isso possa ser um pouco lento, pois bifurca uma nova instância de shell para cada
.c
arquivo.Alternativamente, você pode fazer isso em um loop de shell com
**
globbing recursivo (necessárioshopt -s globstar
no Bash):(Observe que há diferenças entre shells na maneira como
**
lidam com links simbólicos dentro da árvore.)