It seems like you are using those terms at a level where the two have little distinction. For instance, if I were making a user interface for a program and had some file saying
Logo:
Title: Cool UI
Color: Green
That is a declarative representation of my ui. It is data that represents what I want the computer to do. If I were to instead make my ui by using code like
l = Logo()
l.add(Title('Cool UI'))
l.add(Color('Green'))
ui.render(l)
That would be an imperative representation of my ui. I am telling the computer what to do each step of the way. When we talk about the cp command, its worth thinking about what the difference between an "imperative" and "declarative" version would be. On the one hand, you cant get more imperative than telling the computer to
cp a.zip b.zip
Which from a certain perspective is just like saying "hey increment this register" or "hey move whats at this memory address to this memory address", which in assembly is just
mov r0, r1
That being said, if you were to describe in data what you wanted to do you would say something like
copy-paste: a.zip b.zip
Which, take out the colon and shorten the name and you get
cp a.zip b.zip
TL;DR at this level of specification, there is basically no difference between imperative and declarative