command line - Rename files in different directories with the same name, so each has a unique (numbered) name - Ask Ubuntu
i need rename files on sd card, able copy contents of multiple sub folders hdd. first need find them extension .mod
(i can using find ./path/*.mod2
, in different directories).
i need rename them because have names mov001.mod
, mov002.mod
, in other directory other videos, named. created camera. after renaming, copy them 1 command hdd.
because of actual names, when use cp ./path/*.mod new-path
, result overwrite named files.
how can solve this?
this tiny script renames files without moving them
n=0; files in dir1/*.mod dir2/*.mod dir3/*.mod; printf -v new "${files/mov*./%02d.}" "$((++n))"; echo mv -v "$files" "$new"; done
or more readably:
#!/bin/bash n=0 files in dir1/*.mod dir2/*.mod dir3/*.mod; printf -v new "${files/mov*./%02d.}" "$((++n))" echo mv -v -- "$files" "$new" done
replace dir1
etc actual paths directories files
remove echo
(it's test) after checking gives want, rename files.
this numbers files 01.mod
, 02.mod
, etc. if have more 99 files, replace %02d
%03d
001.mod
etc
explanation:
n=0
sets n
0
want bash start counting from.
for files in dir1/*.mod dir2/*.mod dir3/*.mod
a for
loop can execute commands iteratively on each file in turn. syntax for [variable] in [these things want to] ; [command(s)] $[variable]; done
have called variable files
, found files using glob: *.mod
expanded shell file name ends in .mod
(*
matches characters)
printf -v new
printf
can format new numbers fixed width easier sorting. new
variable - new name files.
"${files/mov*./%02d.}" "$((++n))"
referencing variable files
earlier , replacing mov*
(remember *
character) result of incrementing number $((++n))
(this n
first line of script, go 1 each time loop executed on file) formatted using code %02d
printf
means decimal number of fixed width of 2 digits 01, 02 etc. search , replace pattern includes .
stop *
matching whole filename , removing extension.
echo mv -v -- "$files" "$new"
i add echo
testing - shows done instead of doing it. remove echo when happy result execute command.
mv
renames or moves files; syntax mv oldname newname
. added -v
flag tells mv
"verbose" , report each action. added --
safe - tells mv
not accept further options, stops filenames starting -
being interpreted options command - not needed in case, practice.
each file specified files
variable mv
ed unique name created in new
variable. use $
reference variables , these should in "double quotes" prevent shell doing other expansions on filenames - stops special characters or spaces in filenames causing problems.
Comments
Post a Comment