Linux mv file with long name
In Linux I sometimes rename files like this:
mv dir1/dir2/dir3/file.txt dir1/dir2/dir3/file.txt.old
Note that I want to just rename the file, not move it to another directory.
Is there a command that would allow me to do a shorthand version of that command? I am thinking something like:
mv dir1/dir2/dir3/file.txt file.txt.old
or maybe even something like (to just append to the name):
mv dir1/dir2/dir3/file.txt {}.old
My goal is not to have to specify the complete path again.
I know those "examples" I wrote don't work, but it is just an idea of what I want to accomplish.
I don't want to have to cd in to the directory.
Solution 1:
for a single file try
mv dir1/dir2/dir3/file.{txt,txt.old}
where the X{a,b}
construct expand to Xa Xb
, you can have a preview using
echo dir1/dir2/dir3/file.{txt,txt.old}
to see if it fit your need.
note:
-
that for multiple files
mv dir1/dir2/dir3/file{1,2,3}.{txt,txt.old}
is unlikely to expand to what you want. (this will expand to a mixed of file.txt file1.txt.old file2.txt ...)
{txt,txt.old}
can be shorterned to{,.old}
as per comment-
if directory name are unambigous, wildcard can be used.
mv *1/*2/d*/*.{,old}
for multiple file use rename
rename -n s/txt/old.txt/ dir1/dir2/dir3/file*.txt
drop -n
to have effective rename.
Solution 2:
The command rename
renames all matched files. Its main purpose is to rename multiple files, but if the Perl expression matches only one file, then it will rename only this single file. For details and distro specific syntax please read the manpage: man rename
.
Example usage: rename "/path/file.txt" to "/path/file.txt.old":
rename 's/file.txt/file.txt.old/g' /path/file.txt
Shorter notation (thanks to shalomb):
rename 's/$/.old/' /path/file.txt
rename '$_.=".old"' /path/file.txt
For a dry run use rename -n
.
More examples and details can be found at https://thepcspy.com/read/bulk-rename-files-in-ubuntu/
Solution 3:
For a one-off case, if I want to not change my current directory I might just use a sub-shell:
(cd dir1/dir2/dir3/ && mv file.txt file.txt.old)
Because you cd
inside the sub-shell, you haven't changed your directory in your actual shell