Uma abordagem genérica é definir uma função de shell que imprima um intervalo de nomes de arquivos. Uma versão simples dessa função listará todos os arquivos entre dois nomes de arquivos, inclusive no diretório atual:
range()
{
ls | sed -n "/^$1\$/,/^$2\$/p"
}
Isso usa um intervalo sed dizendo para imprimir qualquer coisa entre as duas strings dadas ( $1
e $2
).
Você pode usar essa função no comando cp(1)
:
cp $(range asps.cfg acpi.txt) /destination/path
Isso falhará se você tiver nomes de arquivos com espaços neles. Para isso, você precisa ficar um pouco mais complicado:
range asps.cfg acpi.txt | xargs -d '\n' -I {} cp {} /destination/path
Isso falhará se seus nomes de arquivo tiverem novas linhas (\ n) neles. Isso é muito improvável, então consertar isso é deixado como um exercício para o leitor.
Você pode juntar isso em outra função de shell:
cprange()
{
[ $# -eq 3 ] || { echo "usage: cprange start end dir" >&2; return 1;}
range "$1" "$2" | xargs -d '\n' -I {} cp {} "$3"
}
e use-o como:
cprange filenameX filenameY destination
Lembre-se, o intervalo funciona apenas para nomes de arquivos no diretório atual. Você pode expandir isso de várias maneiras (parâmetro de diretório adicional para range
, extrair um caminho de argumentos para range
usando dirname
, etc), mas deixaremos isso para você com base em seus requisitos. Por favor, pergunte se você quiser mais detalhes aqui.