问题
I have a series of music folders. Some of the file names contain an underscore which I would like to get rid of.
With
find /Users/Chris/CDs -type f -name "*_*"
I find all of the files with underscores.
it appears that I can add -execdir mv {}
to the command but do not know what to add from there.
I think {}
provides the full path and file name as a string of the file with underscores but I do not know how to use something like sed 's/_//g'
to remove the _ on the new file name.
Any help would be greatly appreciated.
回答1:
Try:
find /Users/Chris/CDs -type f -name "*_*" -execdir bash -c 'mv -i -- "$1" "${1//_/}"' Mover {} \;
How it works:
-execdir bash -c '...' Mover {} \;
This starts up bash and tells it to run the command in the single quotes with
Mover
assigned to$0
and the file name assigned to$1
.mv -i -- "$1" "${1//_/}"
This renames file
$1
. This uses bash's parameter expansion feature,${1//_/}
, to create the target name from$1
by removing all underlines.The option
-i
tellsmv
to ask interactively before overwriting a file.The option
--
tellsmv
that there are no more options. This is needed so that files whose names begin with-
will be processed correctly.
Example
Let's start with a directory with these files:
$ ls
1_2_3_4 a_b c_d
Next we run our command:
$ find . -type f -name "*_*" -execdir bash -c 'mv -i -- "$1" "${1//_}"' Mover {} \;
After the command completes, the files are:
$ ls
1234 ab cd
The purpose of $0
Observe this command where we have added an error:
$ find . -type f -name "*_*" -execdir bash -c 'foobar -i -- "$1" "${1//_}"' Mover {} \;
Mover: foobar: command not found
Note that Mover
appears at the beginning of the error message. This signals that the error comes from within the bash -c
command.
If we replace Mover
with -
, we would see:
$ find . -type f -name "*_*" -execdir bash -c 'foobar -i -- "$1" "${1//_}"' - {} \;
-: foobar: command not found
When running a single command in a terminal, the source of the error may still be obvious anyway. If this find
command were buried inside a long script, however, the use of a more descriptive $0
, like Mover
or whatever, could be a big help.
来源:https://stackoverflow.com/questions/55643041/how-do-i-rename-files-found-with-the-find-command