Let's say, for example, you have a directory of files named x01-001; x01-002; x02-001; x02-002; x03-001... and so on.
I want to create subdirectories for each 'x' iteration and move each set to the corresponding subdirectory. My loop would look like this:
for i in {1..3}; do mkdir Data_x0$i && mv x0$i* Data_x0$i; done
I've also been using it if I need to rename large batches of files quickly.
Check out rename
$ touch foo{1..5}.txt
$ rename -v 's/foo/bar/' foo*
foo1.txt renamed as bar1.txt
foo2.txt renamed as bar2.txt
foo3.txt renamed as bar3.txt
foo4.txt renamed as bar4.txt
foo5.txt renamed as bar5.txt
$ rename -v 's/\.txt/.text/' *.txt
bar1.txt renamed as bar1.text
bar2.txt renamed as bar2.text
bar3.txt renamed as bar3.text
bar4.txt renamed as bar4.text
bar5.txt renamed as bar5.text
$ rename -v 's/(.*)\.text/1234-$1.txt/' *.text
bar1.text renamed as 1234-bar1.txt
bar2.text renamed as 1234-bar2.txt
bar3.text renamed as 1234-bar3.txt
bar4.text renamed as 1234-bar4.txt
bar5.text renamed as 1234-bar5.txt
In your second example, it looks like you have an escape character before the first 'dot', but not the second one. Is this a typo, or am I misunderstanding the command?
It's not a typo. The first section of the regex is a matching section, where a dot means "match any character", and an escaped dot is a literal dot character. The second section is the replacement section, and you don't have to escape the dot there because that section isn't matching anything. You can escape it though if it makes the code easier to read.
rename is written in Perl so all Perl regular expression syntaxes are valid.
However, your comment did make me realize that I hadn't escaped my dot in the third example! So I fixed that.
SED combinator, you win 🙌
xargs is also fun, and assuming your for loop doesn't update anything out of the loop, is highly parallelizable
The equivalent of the same command, that handles 10 tasks concurrently, using %% as a variable placeholder.
Let's say, for example, you have a directory of files named x01-001; x01-002; x02-001; x02-002; x03-001... and so on.
I want to create subdirectories for each 'x' iteration and move each set to the corresponding subdirectory. My loop would look like this:
for i in {1..3}; do mkdir Data_x0$i && mv x0$i* Data_x0$i; done
I've also been using it if I need to rename large batches of files quickly.
Check out
rename
In your second example, it looks like you have an escape character before the first 'dot', but not the second one. Is this a typo, or am I misunderstanding the command?
It's not a typo. The first section of the regex is a matching section, where a dot means "match any character", and an escaped dot is a literal dot character. The second section is the replacement section, and you don't have to escape the dot there because that section isn't matching anything. You can escape it though if it makes the code easier to read.
rename
is written in Perl so all Perl regular expression syntaxes are valid.However, your comment did make me realize that I hadn't escaped my dot in the third example! So I fixed that.
SED combinator, you win 🙌
xargs
is also fun, and assuming your for loop doesn't update anything out of the loop, is highly parallelizableThe equivalent of the same command, that handles 10 tasks concurrently, using
%%
as a variable placeholder.But for mass renaming files,
dired
along with rectangle-select and multicursors within Emacs is my goto.