How do I rename files found with the find command

倖福魔咒の 提交于 2019-12-11 07:33:59

问题


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 tells mv to ask interactively before overwriting a file.

    The option -- tells mv 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

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!