Sometimes, you have an ordered set of files to work - a common example may be numbered files in the format of 1.mp3, 2.mp3, … or even something like page001.png, page002.png, and so on. The
seq command makes working with these easy (and comes built in on Linux and macOS).
Why this Matters
Imagine having 1000 files numbered in order (page0001.png, page0002.png … page1000.png), and you want to add a page at the beginning that becomes page0001.png, and the remaining pages would move up accordingly - instead of moving 999 pages to increase their numbers, you can use a combination of
seq with a for loop as above to move these with relative ease.
for i in `seq -w 1 1000`; do # the updated page is just i + 1, so page 1 will be 2, and so on updated_page=$((i+1)) mv page$i.png page$updated_page.png done
# prints 1 through 5 seq 1 5 # Output # 1 # 2 # 3 # 4 # 5 # the second parameter is the amount to increment by if there are 3 parameters seq 4 2 10 # Outputs # 4 # 6 # 8 # 10 # backwards seq 5 1 # Outputs # 5 # 4 # 3 # 2 # 1
I recently learned that you can change the delimiter between the numbers using the
seq -s, 1 5 # Outputs 1,2,3,4,5, <without a newline> # pass -t \\n if you want a newline at the end
Two other useful flags are the
-w and the
-f flags. The
-w flag is an easy way to zero pad numbers to be the same width. this is really useful when say i have a list of page001.png, page002.png, … page100.png - by using
seq -w 1 100, I’ll get a list of 001, 002, … 100. The
-f flag is for the format to print numbers - so
seq -f "%03g" 9 10 would output 009 and 010.
Note that aside from moving files (or aside from ordered collections of files), this is also useful for other things as well - for example, if you want to run an app changing parameters to see what gets the best output, you can generate that parameter with
seq understand floating point, so
seq 1 0.5 4 would output 1, 1.5, 2, 2.5, 3, 3.5, 4.