Enquanto as outras respostas estão corretas, quero oferecer uma abordagem diferente que não requeira várias invocações de find
para varrer a mesma estrutura de diretórios repetidamente. A ideia básica é usar find
para
- gera uma lista de arquivos que correspondem aos critérios comuns,
- aplica um filtro personalizado a essa lista e
- execute alguma ação, e. g.
cp
, nas entradas da lista filtrada.
Implementação 1
(requer o Bash para ler registros delimitados por nulo)
find /some/path -type f -print0 |
while read -rd '' f; do
case "${f##*/}" in
file1|file2|file3)
printf '%sif [[ "${f##*/}" == file1 || "${f##*/}" == file2 || "${f##*/}" == file3 ]]; then
printf '%sFILE_NAMES=( "file1" "file2" "file3" ... )
find /some/path -type f -print0 |
while read -rd '' f; do
for needle in "${FILE_NAMES[@]}"; do
if [ "${f##*/}" = "$needle" ]; then
printf '%sdeclare -A FILE_NAMES=( ["file1"]= ["file2"]= ["file3"]= ... ) # Note the superscripts with []=
find /some/path -type f -print0 |
while read -rd '' f; do
if [ -v FILE_NAMES["${f##*/}"] ]; then
printf '%sfind /some/path -type f -print0 |
while read -rd '' f; do
case "${f##*/}" in
file1|file2|file3)
printf '%sif [[ "${f##*/}" == file1 || "${f##*/}" == file2 || "${f##*/}" == file3 ]]; then
printf '%sFILE_NAMES=( "file1" "file2" "file3" ... )
find /some/path -type f -print0 |
while read -rd '' f; do
for needle in "${FILE_NAMES[@]}"; do
if [ "${f##*/}" = "$needle" ]; then
printf '%sdeclare -A FILE_NAMES=( ["file1"]= ["file2"]= ["file3"]= ... ) # Note the superscripts with []=
find /some/path -type f -print0 |
while read -rd '' f; do
if [ -v FILE_NAMES["${f##*/}"] ]; then
printf '%s%pre%' "$f"
fi
done |
xargs -r0 -- cp -vt /some/other/path --
' "$f"
fi
done
done |
xargs -r0 -- cp -vt /some/other/path --
' "$f"
fi
' "$f";;
esac
done |
xargs -r0 -- cp -vt /some/other/path --
' "$f"
fi
done |
xargs -r0 -- cp -vt /some/other/path --
' "$f"
fi
done
done |
xargs -r0 -- cp -vt /some/other/path --
' "$f"
fi
' "$f";;
esac
done |
xargs -r0 -- cp -vt /some/other/path --
Cada canal corresponde ao início do próximo passo dos três passos descritos acima.
A declaração case
tem a vantagem de permitir correspondências globbing . Alternativamente, você pode usar as expressões condicionais do Bash:
Implementação 2
Se a lista de nomes de arquivos para correspondência for um pouco mais longa e não puder ser substituída por um pequeno conjunto de globbing padrões, ou se a lista de nomes de arquivos para correspondência não é conhecida no momento da escrita, você pode recorrer a um array que contém a lista de nomes de arquivos de interesse:
%pre%Implementação 3
Como variação, podemos usar uma matriz associativa que, esperamos, tenha uma aparência mais rápida vezes mais do que simples matrizes "list":
%pre%