How to rename multiple files in a directory at the same time
.everyoneloves__top-leaderboard:empty,.everyoneloves__mid-leaderboard:empty,.everyoneloves__bot-mid-leaderboard:empty{ margin-bottom:0;
}
I have directory say /var/tmp/abc
which has 4 files:
12345-ram-3e3r5-io9490-89adu9.csv
45434-dam-qwe35-to9490-43adu9.csv
11234-cam-yy3r5-ro9490-85adu9.csv
14423-sam-hh3r5-uo9490-869du9.csv
I want to rename all the CSV files (find all the files & rename them) in shortest possible (probably one-liner) way to this:
XXXXX-ram-3e3r5-io9490-89adu9.csv
XXXXX-dam-qwe35-to9490-43adu9.csv
XXXXX-cam-yy3r5-ro9490-85adu9.csv
XXXXX-sam-hh3r5-uo9490-869du9.csv
shell files rename
add a comment |
I have directory say /var/tmp/abc
which has 4 files:
12345-ram-3e3r5-io9490-89adu9.csv
45434-dam-qwe35-to9490-43adu9.csv
11234-cam-yy3r5-ro9490-85adu9.csv
14423-sam-hh3r5-uo9490-869du9.csv
I want to rename all the CSV files (find all the files & rename them) in shortest possible (probably one-liner) way to this:
XXXXX-ram-3e3r5-io9490-89adu9.csv
XXXXX-dam-qwe35-to9490-43adu9.csv
XXXXX-cam-yy3r5-ro9490-85adu9.csv
XXXXX-sam-hh3r5-uo9490-869du9.csv
shell files rename
add a comment |
I have directory say /var/tmp/abc
which has 4 files:
12345-ram-3e3r5-io9490-89adu9.csv
45434-dam-qwe35-to9490-43adu9.csv
11234-cam-yy3r5-ro9490-85adu9.csv
14423-sam-hh3r5-uo9490-869du9.csv
I want to rename all the CSV files (find all the files & rename them) in shortest possible (probably one-liner) way to this:
XXXXX-ram-3e3r5-io9490-89adu9.csv
XXXXX-dam-qwe35-to9490-43adu9.csv
XXXXX-cam-yy3r5-ro9490-85adu9.csv
XXXXX-sam-hh3r5-uo9490-869du9.csv
shell files rename
I have directory say /var/tmp/abc
which has 4 files:
12345-ram-3e3r5-io9490-89adu9.csv
45434-dam-qwe35-to9490-43adu9.csv
11234-cam-yy3r5-ro9490-85adu9.csv
14423-sam-hh3r5-uo9490-869du9.csv
I want to rename all the CSV files (find all the files & rename them) in shortest possible (probably one-liner) way to this:
XXXXX-ram-3e3r5-io9490-89adu9.csv
XXXXX-dam-qwe35-to9490-43adu9.csv
XXXXX-cam-yy3r5-ro9490-85adu9.csv
XXXXX-sam-hh3r5-uo9490-869du9.csv
shell files rename
shell files rename
edited May 18 at 11:46
Jeff Schaller♦
46.5k1166151
46.5k1166151
asked May 14 at 1:47
Rocky86Rocky86
136111
136111
add a comment |
add a comment |
4 Answers
4
active
oldest
votes
rename -n 's/(w+)/XXXXX/' *.csv
remove the -n
when happy.
2
For a suitable version ofrename
. I assume this is Larry Wall'srename
, from therename
package in Debian and derivative (and IIRCprename
on systems of the RedHat persuasion). A very useful tool.
– xenoid
May 14 at 7:01
2
perl-rename
in arch linux
– lesmana
May 14 at 10:44
1
@SHawarden, I've tried to execute the command and read the relevant portion of man page to understand the replace pattern, but when adding theverbose
flag, it outputs nothing and doesn't perform the file name changes, even though the current path has files with names similar to12345_foo.csv
. Do I have to perform any additional task to get it working (currently on Fedora 30)? It is a cleaner approach than looping. Thanks in advance!
– danieldeveloper001
May 14 at 11:23
3
@danieldeveloper001 Did you userename
orprename
? See my comment above.man {the command}
lists the authors at the end.
– xenoid
May 14 at 11:39
2
This only works on Debian-derived systems. Fedora-derived systems have a completely differentrename
command; see unix.stackexchange.com/a/238862/135943
– Wildcard
May 15 at 6:02
|
show 3 more comments
Try:
for f in *.csv; do mv -i -- "$f" "XXXXX-${f#*-}"; done
How it works:
for f in *.csv; do
This starts a loop over all
*.csv
files.
mv -i -- "$f" "XXXXX-${f#*-}"
This renames the files as you want, asking interactively before overwriting any file.
done
This marks the end of the loop.
Example:
$ ls -1
11234-cam-yy3r5-ro9490-85adu9.csv
12345-ram-3e3r5-io9490-89adu9.csv
14423-sam-hh3r5-uo9490-869du9.csv
45434-dam-qwe35-to9490-43adu9.csv
$ for f in *.csv; do mv -i -- "$f" "XXXXX-${f#*-}"; done
$ ls -1
XXXXX-cam-yy3r5-ro9490-85adu9.csv
XXXXX-dam-qwe35-to9490-43adu9.csv
XXXXX-ram-3e3r5-io9490-89adu9.csv
XXXXX-sam-hh3r5-uo9490-869du9.csv
add a comment |
I liked the little challenge that you've posted, so here is my solution. I'm assuming that all your files starts with 5 numeric characters, so using the cut command to replace the initial numeric files by "XXXXX".
Below, the files before the command.
-rw-rw-r--. 1 daniel daniel 0 May 13 23:18 11111_bar_file.csv
-rw-rw-r--. 1 daniel daniel 0 May 13 22:54 12345_baz_file.csv
-rw-rw-r--. 1 daniel daniel 0 May 13 22:54 67890_foo_file.xml
Below, the one liner command.
for src in *.csv; do dst=XXXXX$(echo $src| cut -c6-); mv $src $dst; done;
Below, the files after the command.
-rw-rw-r--. 1 daniel daniel 0 May 13 22:54 67890_foo_file.xml
-rw-rw-r--. 1 daniel daniel 0 May 13 22:54 XXXXX_bar_file.csv
-rw-rw-r--. 1 daniel daniel 0 May 13 23:18 XXXXX_baz_file.csv
Is that what you're looking for? :)
References:
Looping through command output in bash
Substrings in bash
2
Bash can do this sort of string manipulation, no need to fork a new process for each, please the other answer on how.
– chx
May 14 at 23:45
1
@chx, already saw the other answers and acquired a little bit of knowledge from it, but thanks for pointing them out. Would you please elaborate onno need to fork a new process for each
?
– danieldeveloper001
May 15 at 0:19
3
cut
is a separate binary (/usr/bin/cut
) and running it consumes more resources than using shell built ins.
– chx
May 15 at 0:42
2
I see, it actually matters if the intent is renaming a lot of files. Thank you for the clarification!
– danieldeveloper001
May 15 at 0:55
add a comment |
no forks:
ls | perl -lne '$suf=substr($_,6); rename $_, "XXXXX-$suf"'
When you use a shell loop, the mv
forks once per file. Perl's rename
command does not.
(Perl's rename command has some restrictions, but in this specific case those restrictions don't apply.)
As for the rename
command shown earlier, yes that works, but then you have all that confusion between two different kinds of rename and so on. If you have the right one, great, but if not, this works too.
If you don't have the perl-rename command and can't install it, you can just do this:
ls | perl -lne '$old=$_; s/(w+)/XXXXX/; rename $old, $_'
As you can see, this uses the same substitution shown in the top answer. Of course the perl-rename has other bells and whistles (the top answer mentioned, -n
already, then there's -0
, -f
, and so on), and the more of them you need, the more you should install that instead of rolling your own in this manner.
The usual implementations of a pipe will have forks.
– muru
May 17 at 5:24
I meant, "won't fork once per file to be renamed", unlike even shell, where the "mv" forks /usr/bin/mv or whatever. This is because the "rename" command is a perl internal command that directly calls rename() in libc. Of course it has some restrictions, but in this specific example those restrictions don't apply.
– sitaram
May 17 at 5:31
1
That's also true of therename
command (top answer, also uses Perl), so maybe you should add a little more explanation than simply "no forks" to the answer.
– muru
May 17 at 5:33
add a comment |
Your Answer
StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "106"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});
function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: false,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: null,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2funix.stackexchange.com%2fquestions%2f518800%2fhow-to-rename-multiple-files-in-a-directory-at-the-same-time%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
4 Answers
4
active
oldest
votes
4 Answers
4
active
oldest
votes
active
oldest
votes
active
oldest
votes
rename -n 's/(w+)/XXXXX/' *.csv
remove the -n
when happy.
2
For a suitable version ofrename
. I assume this is Larry Wall'srename
, from therename
package in Debian and derivative (and IIRCprename
on systems of the RedHat persuasion). A very useful tool.
– xenoid
May 14 at 7:01
2
perl-rename
in arch linux
– lesmana
May 14 at 10:44
1
@SHawarden, I've tried to execute the command and read the relevant portion of man page to understand the replace pattern, but when adding theverbose
flag, it outputs nothing and doesn't perform the file name changes, even though the current path has files with names similar to12345_foo.csv
. Do I have to perform any additional task to get it working (currently on Fedora 30)? It is a cleaner approach than looping. Thanks in advance!
– danieldeveloper001
May 14 at 11:23
3
@danieldeveloper001 Did you userename
orprename
? See my comment above.man {the command}
lists the authors at the end.
– xenoid
May 14 at 11:39
2
This only works on Debian-derived systems. Fedora-derived systems have a completely differentrename
command; see unix.stackexchange.com/a/238862/135943
– Wildcard
May 15 at 6:02
|
show 3 more comments
rename -n 's/(w+)/XXXXX/' *.csv
remove the -n
when happy.
2
For a suitable version ofrename
. I assume this is Larry Wall'srename
, from therename
package in Debian and derivative (and IIRCprename
on systems of the RedHat persuasion). A very useful tool.
– xenoid
May 14 at 7:01
2
perl-rename
in arch linux
– lesmana
May 14 at 10:44
1
@SHawarden, I've tried to execute the command and read the relevant portion of man page to understand the replace pattern, but when adding theverbose
flag, it outputs nothing and doesn't perform the file name changes, even though the current path has files with names similar to12345_foo.csv
. Do I have to perform any additional task to get it working (currently on Fedora 30)? It is a cleaner approach than looping. Thanks in advance!
– danieldeveloper001
May 14 at 11:23
3
@danieldeveloper001 Did you userename
orprename
? See my comment above.man {the command}
lists the authors at the end.
– xenoid
May 14 at 11:39
2
This only works on Debian-derived systems. Fedora-derived systems have a completely differentrename
command; see unix.stackexchange.com/a/238862/135943
– Wildcard
May 15 at 6:02
|
show 3 more comments
rename -n 's/(w+)/XXXXX/' *.csv
remove the -n
when happy.
rename -n 's/(w+)/XXXXX/' *.csv
remove the -n
when happy.
answered May 14 at 2:26
SHawardenSHawarden
36415
36415
2
For a suitable version ofrename
. I assume this is Larry Wall'srename
, from therename
package in Debian and derivative (and IIRCprename
on systems of the RedHat persuasion). A very useful tool.
– xenoid
May 14 at 7:01
2
perl-rename
in arch linux
– lesmana
May 14 at 10:44
1
@SHawarden, I've tried to execute the command and read the relevant portion of man page to understand the replace pattern, but when adding theverbose
flag, it outputs nothing and doesn't perform the file name changes, even though the current path has files with names similar to12345_foo.csv
. Do I have to perform any additional task to get it working (currently on Fedora 30)? It is a cleaner approach than looping. Thanks in advance!
– danieldeveloper001
May 14 at 11:23
3
@danieldeveloper001 Did you userename
orprename
? See my comment above.man {the command}
lists the authors at the end.
– xenoid
May 14 at 11:39
2
This only works on Debian-derived systems. Fedora-derived systems have a completely differentrename
command; see unix.stackexchange.com/a/238862/135943
– Wildcard
May 15 at 6:02
|
show 3 more comments
2
For a suitable version ofrename
. I assume this is Larry Wall'srename
, from therename
package in Debian and derivative (and IIRCprename
on systems of the RedHat persuasion). A very useful tool.
– xenoid
May 14 at 7:01
2
perl-rename
in arch linux
– lesmana
May 14 at 10:44
1
@SHawarden, I've tried to execute the command and read the relevant portion of man page to understand the replace pattern, but when adding theverbose
flag, it outputs nothing and doesn't perform the file name changes, even though the current path has files with names similar to12345_foo.csv
. Do I have to perform any additional task to get it working (currently on Fedora 30)? It is a cleaner approach than looping. Thanks in advance!
– danieldeveloper001
May 14 at 11:23
3
@danieldeveloper001 Did you userename
orprename
? See my comment above.man {the command}
lists the authors at the end.
– xenoid
May 14 at 11:39
2
This only works on Debian-derived systems. Fedora-derived systems have a completely differentrename
command; see unix.stackexchange.com/a/238862/135943
– Wildcard
May 15 at 6:02
2
2
For a suitable version of
rename
. I assume this is Larry Wall's rename
, from the rename
package in Debian and derivative (and IIRC prename
on systems of the RedHat persuasion). A very useful tool.– xenoid
May 14 at 7:01
For a suitable version of
rename
. I assume this is Larry Wall's rename
, from the rename
package in Debian and derivative (and IIRC prename
on systems of the RedHat persuasion). A very useful tool.– xenoid
May 14 at 7:01
2
2
perl-rename
in arch linux– lesmana
May 14 at 10:44
perl-rename
in arch linux– lesmana
May 14 at 10:44
1
1
@SHawarden, I've tried to execute the command and read the relevant portion of man page to understand the replace pattern, but when adding the
verbose
flag, it outputs nothing and doesn't perform the file name changes, even though the current path has files with names similar to 12345_foo.csv
. Do I have to perform any additional task to get it working (currently on Fedora 30)? It is a cleaner approach than looping. Thanks in advance!– danieldeveloper001
May 14 at 11:23
@SHawarden, I've tried to execute the command and read the relevant portion of man page to understand the replace pattern, but when adding the
verbose
flag, it outputs nothing and doesn't perform the file name changes, even though the current path has files with names similar to 12345_foo.csv
. Do I have to perform any additional task to get it working (currently on Fedora 30)? It is a cleaner approach than looping. Thanks in advance!– danieldeveloper001
May 14 at 11:23
3
3
@danieldeveloper001 Did you use
rename
or prename
? See my comment above. man {the command}
lists the authors at the end.– xenoid
May 14 at 11:39
@danieldeveloper001 Did you use
rename
or prename
? See my comment above. man {the command}
lists the authors at the end.– xenoid
May 14 at 11:39
2
2
This only works on Debian-derived systems. Fedora-derived systems have a completely different
rename
command; see unix.stackexchange.com/a/238862/135943– Wildcard
May 15 at 6:02
This only works on Debian-derived systems. Fedora-derived systems have a completely different
rename
command; see unix.stackexchange.com/a/238862/135943– Wildcard
May 15 at 6:02
|
show 3 more comments
Try:
for f in *.csv; do mv -i -- "$f" "XXXXX-${f#*-}"; done
How it works:
for f in *.csv; do
This starts a loop over all
*.csv
files.
mv -i -- "$f" "XXXXX-${f#*-}"
This renames the files as you want, asking interactively before overwriting any file.
done
This marks the end of the loop.
Example:
$ ls -1
11234-cam-yy3r5-ro9490-85adu9.csv
12345-ram-3e3r5-io9490-89adu9.csv
14423-sam-hh3r5-uo9490-869du9.csv
45434-dam-qwe35-to9490-43adu9.csv
$ for f in *.csv; do mv -i -- "$f" "XXXXX-${f#*-}"; done
$ ls -1
XXXXX-cam-yy3r5-ro9490-85adu9.csv
XXXXX-dam-qwe35-to9490-43adu9.csv
XXXXX-ram-3e3r5-io9490-89adu9.csv
XXXXX-sam-hh3r5-uo9490-869du9.csv
add a comment |
Try:
for f in *.csv; do mv -i -- "$f" "XXXXX-${f#*-}"; done
How it works:
for f in *.csv; do
This starts a loop over all
*.csv
files.
mv -i -- "$f" "XXXXX-${f#*-}"
This renames the files as you want, asking interactively before overwriting any file.
done
This marks the end of the loop.
Example:
$ ls -1
11234-cam-yy3r5-ro9490-85adu9.csv
12345-ram-3e3r5-io9490-89adu9.csv
14423-sam-hh3r5-uo9490-869du9.csv
45434-dam-qwe35-to9490-43adu9.csv
$ for f in *.csv; do mv -i -- "$f" "XXXXX-${f#*-}"; done
$ ls -1
XXXXX-cam-yy3r5-ro9490-85adu9.csv
XXXXX-dam-qwe35-to9490-43adu9.csv
XXXXX-ram-3e3r5-io9490-89adu9.csv
XXXXX-sam-hh3r5-uo9490-869du9.csv
add a comment |
Try:
for f in *.csv; do mv -i -- "$f" "XXXXX-${f#*-}"; done
How it works:
for f in *.csv; do
This starts a loop over all
*.csv
files.
mv -i -- "$f" "XXXXX-${f#*-}"
This renames the files as you want, asking interactively before overwriting any file.
done
This marks the end of the loop.
Example:
$ ls -1
11234-cam-yy3r5-ro9490-85adu9.csv
12345-ram-3e3r5-io9490-89adu9.csv
14423-sam-hh3r5-uo9490-869du9.csv
45434-dam-qwe35-to9490-43adu9.csv
$ for f in *.csv; do mv -i -- "$f" "XXXXX-${f#*-}"; done
$ ls -1
XXXXX-cam-yy3r5-ro9490-85adu9.csv
XXXXX-dam-qwe35-to9490-43adu9.csv
XXXXX-ram-3e3r5-io9490-89adu9.csv
XXXXX-sam-hh3r5-uo9490-869du9.csv
Try:
for f in *.csv; do mv -i -- "$f" "XXXXX-${f#*-}"; done
How it works:
for f in *.csv; do
This starts a loop over all
*.csv
files.
mv -i -- "$f" "XXXXX-${f#*-}"
This renames the files as you want, asking interactively before overwriting any file.
done
This marks the end of the loop.
Example:
$ ls -1
11234-cam-yy3r5-ro9490-85adu9.csv
12345-ram-3e3r5-io9490-89adu9.csv
14423-sam-hh3r5-uo9490-869du9.csv
45434-dam-qwe35-to9490-43adu9.csv
$ for f in *.csv; do mv -i -- "$f" "XXXXX-${f#*-}"; done
$ ls -1
XXXXX-cam-yy3r5-ro9490-85adu9.csv
XXXXX-dam-qwe35-to9490-43adu9.csv
XXXXX-ram-3e3r5-io9490-89adu9.csv
XXXXX-sam-hh3r5-uo9490-869du9.csv
answered May 14 at 2:20
John1024John1024
50.2k5117131
50.2k5117131
add a comment |
add a comment |
I liked the little challenge that you've posted, so here is my solution. I'm assuming that all your files starts with 5 numeric characters, so using the cut command to replace the initial numeric files by "XXXXX".
Below, the files before the command.
-rw-rw-r--. 1 daniel daniel 0 May 13 23:18 11111_bar_file.csv
-rw-rw-r--. 1 daniel daniel 0 May 13 22:54 12345_baz_file.csv
-rw-rw-r--. 1 daniel daniel 0 May 13 22:54 67890_foo_file.xml
Below, the one liner command.
for src in *.csv; do dst=XXXXX$(echo $src| cut -c6-); mv $src $dst; done;
Below, the files after the command.
-rw-rw-r--. 1 daniel daniel 0 May 13 22:54 67890_foo_file.xml
-rw-rw-r--. 1 daniel daniel 0 May 13 22:54 XXXXX_bar_file.csv
-rw-rw-r--. 1 daniel daniel 0 May 13 23:18 XXXXX_baz_file.csv
Is that what you're looking for? :)
References:
Looping through command output in bash
Substrings in bash
2
Bash can do this sort of string manipulation, no need to fork a new process for each, please the other answer on how.
– chx
May 14 at 23:45
1
@chx, already saw the other answers and acquired a little bit of knowledge from it, but thanks for pointing them out. Would you please elaborate onno need to fork a new process for each
?
– danieldeveloper001
May 15 at 0:19
3
cut
is a separate binary (/usr/bin/cut
) and running it consumes more resources than using shell built ins.
– chx
May 15 at 0:42
2
I see, it actually matters if the intent is renaming a lot of files. Thank you for the clarification!
– danieldeveloper001
May 15 at 0:55
add a comment |
I liked the little challenge that you've posted, so here is my solution. I'm assuming that all your files starts with 5 numeric characters, so using the cut command to replace the initial numeric files by "XXXXX".
Below, the files before the command.
-rw-rw-r--. 1 daniel daniel 0 May 13 23:18 11111_bar_file.csv
-rw-rw-r--. 1 daniel daniel 0 May 13 22:54 12345_baz_file.csv
-rw-rw-r--. 1 daniel daniel 0 May 13 22:54 67890_foo_file.xml
Below, the one liner command.
for src in *.csv; do dst=XXXXX$(echo $src| cut -c6-); mv $src $dst; done;
Below, the files after the command.
-rw-rw-r--. 1 daniel daniel 0 May 13 22:54 67890_foo_file.xml
-rw-rw-r--. 1 daniel daniel 0 May 13 22:54 XXXXX_bar_file.csv
-rw-rw-r--. 1 daniel daniel 0 May 13 23:18 XXXXX_baz_file.csv
Is that what you're looking for? :)
References:
Looping through command output in bash
Substrings in bash
2
Bash can do this sort of string manipulation, no need to fork a new process for each, please the other answer on how.
– chx
May 14 at 23:45
1
@chx, already saw the other answers and acquired a little bit of knowledge from it, but thanks for pointing them out. Would you please elaborate onno need to fork a new process for each
?
– danieldeveloper001
May 15 at 0:19
3
cut
is a separate binary (/usr/bin/cut
) and running it consumes more resources than using shell built ins.
– chx
May 15 at 0:42
2
I see, it actually matters if the intent is renaming a lot of files. Thank you for the clarification!
– danieldeveloper001
May 15 at 0:55
add a comment |
I liked the little challenge that you've posted, so here is my solution. I'm assuming that all your files starts with 5 numeric characters, so using the cut command to replace the initial numeric files by "XXXXX".
Below, the files before the command.
-rw-rw-r--. 1 daniel daniel 0 May 13 23:18 11111_bar_file.csv
-rw-rw-r--. 1 daniel daniel 0 May 13 22:54 12345_baz_file.csv
-rw-rw-r--. 1 daniel daniel 0 May 13 22:54 67890_foo_file.xml
Below, the one liner command.
for src in *.csv; do dst=XXXXX$(echo $src| cut -c6-); mv $src $dst; done;
Below, the files after the command.
-rw-rw-r--. 1 daniel daniel 0 May 13 22:54 67890_foo_file.xml
-rw-rw-r--. 1 daniel daniel 0 May 13 22:54 XXXXX_bar_file.csv
-rw-rw-r--. 1 daniel daniel 0 May 13 23:18 XXXXX_baz_file.csv
Is that what you're looking for? :)
References:
Looping through command output in bash
Substrings in bash
I liked the little challenge that you've posted, so here is my solution. I'm assuming that all your files starts with 5 numeric characters, so using the cut command to replace the initial numeric files by "XXXXX".
Below, the files before the command.
-rw-rw-r--. 1 daniel daniel 0 May 13 23:18 11111_bar_file.csv
-rw-rw-r--. 1 daniel daniel 0 May 13 22:54 12345_baz_file.csv
-rw-rw-r--. 1 daniel daniel 0 May 13 22:54 67890_foo_file.xml
Below, the one liner command.
for src in *.csv; do dst=XXXXX$(echo $src| cut -c6-); mv $src $dst; done;
Below, the files after the command.
-rw-rw-r--. 1 daniel daniel 0 May 13 22:54 67890_foo_file.xml
-rw-rw-r--. 1 daniel daniel 0 May 13 22:54 XXXXX_bar_file.csv
-rw-rw-r--. 1 daniel daniel 0 May 13 23:18 XXXXX_baz_file.csv
Is that what you're looking for? :)
References:
Looping through command output in bash
Substrings in bash
edited May 14 at 2:26
answered May 14 at 2:21
danieldeveloper001danieldeveloper001
1796
1796
2
Bash can do this sort of string manipulation, no need to fork a new process for each, please the other answer on how.
– chx
May 14 at 23:45
1
@chx, already saw the other answers and acquired a little bit of knowledge from it, but thanks for pointing them out. Would you please elaborate onno need to fork a new process for each
?
– danieldeveloper001
May 15 at 0:19
3
cut
is a separate binary (/usr/bin/cut
) and running it consumes more resources than using shell built ins.
– chx
May 15 at 0:42
2
I see, it actually matters if the intent is renaming a lot of files. Thank you for the clarification!
– danieldeveloper001
May 15 at 0:55
add a comment |
2
Bash can do this sort of string manipulation, no need to fork a new process for each, please the other answer on how.
– chx
May 14 at 23:45
1
@chx, already saw the other answers and acquired a little bit of knowledge from it, but thanks for pointing them out. Would you please elaborate onno need to fork a new process for each
?
– danieldeveloper001
May 15 at 0:19
3
cut
is a separate binary (/usr/bin/cut
) and running it consumes more resources than using shell built ins.
– chx
May 15 at 0:42
2
I see, it actually matters if the intent is renaming a lot of files. Thank you for the clarification!
– danieldeveloper001
May 15 at 0:55
2
2
Bash can do this sort of string manipulation, no need to fork a new process for each, please the other answer on how.
– chx
May 14 at 23:45
Bash can do this sort of string manipulation, no need to fork a new process for each, please the other answer on how.
– chx
May 14 at 23:45
1
1
@chx, already saw the other answers and acquired a little bit of knowledge from it, but thanks for pointing them out. Would you please elaborate on
no need to fork a new process for each
?– danieldeveloper001
May 15 at 0:19
@chx, already saw the other answers and acquired a little bit of knowledge from it, but thanks for pointing them out. Would you please elaborate on
no need to fork a new process for each
?– danieldeveloper001
May 15 at 0:19
3
3
cut
is a separate binary (/usr/bin/cut
) and running it consumes more resources than using shell built ins.– chx
May 15 at 0:42
cut
is a separate binary (/usr/bin/cut
) and running it consumes more resources than using shell built ins.– chx
May 15 at 0:42
2
2
I see, it actually matters if the intent is renaming a lot of files. Thank you for the clarification!
– danieldeveloper001
May 15 at 0:55
I see, it actually matters if the intent is renaming a lot of files. Thank you for the clarification!
– danieldeveloper001
May 15 at 0:55
add a comment |
no forks:
ls | perl -lne '$suf=substr($_,6); rename $_, "XXXXX-$suf"'
When you use a shell loop, the mv
forks once per file. Perl's rename
command does not.
(Perl's rename command has some restrictions, but in this specific case those restrictions don't apply.)
As for the rename
command shown earlier, yes that works, but then you have all that confusion between two different kinds of rename and so on. If you have the right one, great, but if not, this works too.
If you don't have the perl-rename command and can't install it, you can just do this:
ls | perl -lne '$old=$_; s/(w+)/XXXXX/; rename $old, $_'
As you can see, this uses the same substitution shown in the top answer. Of course the perl-rename has other bells and whistles (the top answer mentioned, -n
already, then there's -0
, -f
, and so on), and the more of them you need, the more you should install that instead of rolling your own in this manner.
The usual implementations of a pipe will have forks.
– muru
May 17 at 5:24
I meant, "won't fork once per file to be renamed", unlike even shell, where the "mv" forks /usr/bin/mv or whatever. This is because the "rename" command is a perl internal command that directly calls rename() in libc. Of course it has some restrictions, but in this specific example those restrictions don't apply.
– sitaram
May 17 at 5:31
1
That's also true of therename
command (top answer, also uses Perl), so maybe you should add a little more explanation than simply "no forks" to the answer.
– muru
May 17 at 5:33
add a comment |
no forks:
ls | perl -lne '$suf=substr($_,6); rename $_, "XXXXX-$suf"'
When you use a shell loop, the mv
forks once per file. Perl's rename
command does not.
(Perl's rename command has some restrictions, but in this specific case those restrictions don't apply.)
As for the rename
command shown earlier, yes that works, but then you have all that confusion between two different kinds of rename and so on. If you have the right one, great, but if not, this works too.
If you don't have the perl-rename command and can't install it, you can just do this:
ls | perl -lne '$old=$_; s/(w+)/XXXXX/; rename $old, $_'
As you can see, this uses the same substitution shown in the top answer. Of course the perl-rename has other bells and whistles (the top answer mentioned, -n
already, then there's -0
, -f
, and so on), and the more of them you need, the more you should install that instead of rolling your own in this manner.
The usual implementations of a pipe will have forks.
– muru
May 17 at 5:24
I meant, "won't fork once per file to be renamed", unlike even shell, where the "mv" forks /usr/bin/mv or whatever. This is because the "rename" command is a perl internal command that directly calls rename() in libc. Of course it has some restrictions, but in this specific example those restrictions don't apply.
– sitaram
May 17 at 5:31
1
That's also true of therename
command (top answer, also uses Perl), so maybe you should add a little more explanation than simply "no forks" to the answer.
– muru
May 17 at 5:33
add a comment |
no forks:
ls | perl -lne '$suf=substr($_,6); rename $_, "XXXXX-$suf"'
When you use a shell loop, the mv
forks once per file. Perl's rename
command does not.
(Perl's rename command has some restrictions, but in this specific case those restrictions don't apply.)
As for the rename
command shown earlier, yes that works, but then you have all that confusion between two different kinds of rename and so on. If you have the right one, great, but if not, this works too.
If you don't have the perl-rename command and can't install it, you can just do this:
ls | perl -lne '$old=$_; s/(w+)/XXXXX/; rename $old, $_'
As you can see, this uses the same substitution shown in the top answer. Of course the perl-rename has other bells and whistles (the top answer mentioned, -n
already, then there's -0
, -f
, and so on), and the more of them you need, the more you should install that instead of rolling your own in this manner.
no forks:
ls | perl -lne '$suf=substr($_,6); rename $_, "XXXXX-$suf"'
When you use a shell loop, the mv
forks once per file. Perl's rename
command does not.
(Perl's rename command has some restrictions, but in this specific case those restrictions don't apply.)
As for the rename
command shown earlier, yes that works, but then you have all that confusion between two different kinds of rename and so on. If you have the right one, great, but if not, this works too.
If you don't have the perl-rename command and can't install it, you can just do this:
ls | perl -lne '$old=$_; s/(w+)/XXXXX/; rename $old, $_'
As you can see, this uses the same substitution shown in the top answer. Of course the perl-rename has other bells and whistles (the top answer mentioned, -n
already, then there's -0
, -f
, and so on), and the more of them you need, the more you should install that instead of rolling your own in this manner.
edited May 17 at 6:15
muru
39.2k595170
39.2k595170
answered May 17 at 5:15
sitaramsitaram
713
713
The usual implementations of a pipe will have forks.
– muru
May 17 at 5:24
I meant, "won't fork once per file to be renamed", unlike even shell, where the "mv" forks /usr/bin/mv or whatever. This is because the "rename" command is a perl internal command that directly calls rename() in libc. Of course it has some restrictions, but in this specific example those restrictions don't apply.
– sitaram
May 17 at 5:31
1
That's also true of therename
command (top answer, also uses Perl), so maybe you should add a little more explanation than simply "no forks" to the answer.
– muru
May 17 at 5:33
add a comment |
The usual implementations of a pipe will have forks.
– muru
May 17 at 5:24
I meant, "won't fork once per file to be renamed", unlike even shell, where the "mv" forks /usr/bin/mv or whatever. This is because the "rename" command is a perl internal command that directly calls rename() in libc. Of course it has some restrictions, but in this specific example those restrictions don't apply.
– sitaram
May 17 at 5:31
1
That's also true of therename
command (top answer, also uses Perl), so maybe you should add a little more explanation than simply "no forks" to the answer.
– muru
May 17 at 5:33
The usual implementations of a pipe will have forks.
– muru
May 17 at 5:24
The usual implementations of a pipe will have forks.
– muru
May 17 at 5:24
I meant, "won't fork once per file to be renamed", unlike even shell, where the "mv" forks /usr/bin/mv or whatever. This is because the "rename" command is a perl internal command that directly calls rename() in libc. Of course it has some restrictions, but in this specific example those restrictions don't apply.
– sitaram
May 17 at 5:31
I meant, "won't fork once per file to be renamed", unlike even shell, where the "mv" forks /usr/bin/mv or whatever. This is because the "rename" command is a perl internal command that directly calls rename() in libc. Of course it has some restrictions, but in this specific example those restrictions don't apply.
– sitaram
May 17 at 5:31
1
1
That's also true of the
rename
command (top answer, also uses Perl), so maybe you should add a little more explanation than simply "no forks" to the answer.– muru
May 17 at 5:33
That's also true of the
rename
command (top answer, also uses Perl), so maybe you should add a little more explanation than simply "no forks" to the answer.– muru
May 17 at 5:33
add a comment |
Thanks for contributing an answer to Unix & Linux Stack Exchange!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2funix.stackexchange.com%2fquestions%2f518800%2fhow-to-rename-multiple-files-in-a-directory-at-the-same-time%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown