That may not work correctly, depending on what characters are in the file name:
$ ls -l
total 0
-rw-r--r-- 1 john john 0 Feb 1 20:23 four
-rw-r--r-- 1 john john 0 Feb 1 20:23 one
-rw-r--r-- 1 john john 0 Feb 1 20:23 two ? three
$ ls | perl -nle 'BEGIN { $counter = 0 }; $old = $_; $new = "caption"
+. "$counter" . ".txt"; rename( $old, $new ); $counter++;'
$ ls -l
total 0
-rw-r--r-- 1 john john 0 Feb 1 20:23 caption0.txt
-rw-r--r-- 1 john john 0 Feb 1 20:23 caption1.txt
-rw-r--r-- 1 john john 0 Feb 1 20:23 two ? three
Better to use perl's built-in glob function:
$ ls -l
total 0
-rw-r--r-- 1 john john 0 Feb 1 20:28 four
-rw-r--r-- 1 john john 0 Feb 1 20:28 one
-rw-r--r-- 1 john john 0 Feb 1 20:28 two ? three
$ perl -e '$counter = 0; for ( <*> ) { $old = $_; $new = "caption" . "
+$counter" . ".txt"; rename( $old, $new ); $counter++; }'
$ ls -l
total 0
-rw-r--r-- 1 john john 0 Feb 1 20:28 caption0.txt
-rw-r--r-- 1 john john 0 Feb 1 20:28 caption1.txt
-rw-r--r-- 1 john john 0 Feb 1 20:28 caption2.txt