Aqui está um código simplificado que imprime o nome do diretório se ele contiver um nome de arquivo com o mesmo nome do diretório pai e da .md
extensão.
FIND(){
find . -type d -exec sh -c '
for d do
[ -f "${d}/${d##*/}.md" ] && printf "%s\n" "$d"
done' find-sh {} +
}
FIND
Para generalizar, quero enviar o termo de pesquisa ${d}/${d##*/}.md
como argumento para a FIND
função, mas infelizmente isso não gera nada:
FIND(){
local SearchTerm="${1}"
find . -type d -exec sh -c '
for d do
[ -f "${SearchTerm}" ] && printf "%s\n" "$d"
done' find-sh {} +
}
FIND '${d}/${d##*/}.md'
Tenho certeza de que há algum problema com a cotação do SearchTerm
. Alguma dica?
Eu tentei: FIND '\${d}/\${d##*/}.md'
mas não tem saída
"${SearchTerm}"
precisa estar fora dosh -c '
para ser extrapolado, como segue:Para explicar um pouco mais, podemos fazer um pequeno teste:
'Before "$SearchTerm" After'
é uma única string sem nenhuma expansão de parâmetro porque está tudo entre aspas simples.'Before "'"$SearchTerm"'" After'
é na verdade três strings se unindo:'Before "'
# no final, é aspas duplas seguidas de aspas simples"$SearchTerm"
# expansão de parâmetro acontece aqui.'" After'
# no início, é uma aspa simples seguida de aspas duplasEspero que esteja mais claro.
O script in-line que você chama está entre aspas simples (como deveria ser). Isso significa que o
sh -c
shell receberá um script onde"${SearchTerm}"
não é expandido. Como esse shell não possui umaSearchTerm
variável, seu valor estará vazio.Como você marcou sua pergunta com bash , você pode passar o nome de uma função exportada:
O
testfunc=${1:-:}
no código será atribuído$1
atestfunc
se estiver disponível e não vazio, caso contrário, ele será usado:
como teste (um utilitário sem operação que retorna true).Algumas abordagens alternativas para poder executar código shell arbitrário em vez de apenas
[ -f "$d/${d##*/}.md" ]
:Passe o código do shell como o primeiro argumento e use
eval
para interpretá-lo:O mesmo com uma variável de ambiente
De se o código do shell para interpretar sempre será
[ -f "something" ]
:Observe que, se estiver usando
zsh
, você pode usar seue
qualificador glob para qualificar ainda mais os diretórios (/
) com uma expressão de shell arbitráriae
:Ou com uma função:
(
N
paranullglob
,D
paradotglob
não ignorar arquivos e diretórios ocultos)