Rename files and directories recursively under ubuntu /bash

后端 未结 8 1094
执念已碎
执念已碎 2020-11-29 18:50

I want to rename all files and directories that contain the word \"special\" to \"regular\". It should maintain case sensitivity so \"Special\" won\'t become \"regular\".

相关标签:
8条回答
  • 2020-11-29 19:40

    Here is another approach which is more portable and does not rely on the rename command (since it may require different parameters depending on the distros).

    It renames files and directories recursively:

    find . -depth -name "*special*" | \
    while IFS= read -r ent; do mv $ent ${ent%special*}regular${ent##*special}; done
    

    What it does

    • use find with -depth parameter to reorder the results by performing a depth-first traversal (i.e. all entries in a directory are displayed before the directory itself).
    • do pattern substitutions to only modifiy the last occurence of regular in the path.

    That way the files are modified first and then each parent directory.

    Example

    Giving the following tree:

    ├── aa-special-aa
    │   └── bb-special
    │       ├── special-cc
    │       ├── special-dd
    │       └── Special-ee
    └── special-00
    

    It generate those mv commands in that particular order:

    mv ./aa-special-aa/bb-special/special-cc ./aa-special-aa/bb-special/regular-cc
    mv ./aa-special-aa/bb-special/special-dd ./aa-special-aa/bb-special/regular-dd
    mv ./aa-special-aa/bb-special ./aa-special-aa/bb-regular
    mv ./aa-special-aa ./aa-regular-aa
    mv ./special-00 ./regular-00
    

    To obtain the following tree:

    ├── aa-regular-aa
    │   └── bb-regular
    │       ├── regular-cc
    │       ├── regular-dd
    │       └── Special-ee
    └── regular-00
    
    0 讨论(0)
  • 2020-11-29 19:49

    Try doing this (require bash --version >= 4):

    shopt -s globstar
    rename -n 's/special/regular/' **
    

    Remove the -n switch when your tests are OK

    warning There are other tools with the same name which may or may not be able to do this, so be careful.

    If you run the following command (GNU)

    $ file "$(readlink -f "$(type -p rename)")"
    

    and you have a result like

    .../rename: Perl script, ASCII text executable
    

    and not containing:

    ELF
    

    then this seems to be the right tool =)

    If not, to make it the default (usually already the case) on Debian and derivative like Ubuntu :

    $ sudo update-alternatives --set rename /path/to/rename
    

    (replace /path/to/rename to the path of your perl's rename command.


    If you don't have this command, search your package manager to install it or do it manually


    Last but not least, this tool was originally written by Larry Wall, the Perl's dad.

    0 讨论(0)
提交回复
热议问题