Search code examples
bashfile-renamegnu-parallel

Renaming .jpg files in the sub-folders


I have a large number of files in sub-folders that I need to rename. For example, I have:

ParentFolder/sub-Folders/*.jpg

How can I copy the files with a new naming convention as follows?

ParentFolder1.jpg
ParentFolder2.jpg

Solution

  • Use rename over the full path using file globbing :

    */*
    

    If you don't understand, you can test it with :

    echo */*
    

    First * is your directory, second * is your file name. Catch them in a regular expression :

    (.*)/(.*)
    

    Now $1 is your parent folder name and $2 is your file name. You can easily build your solution like this :

    rename -n "s/(.*)\/(.*)/\$1\/\$1\$2/" */*
    

    It keeps directory structure and adds directory name as a prefix to each of its files. You could move your files up by simply changing \$1\/\$1\$2 to \$1\$2. You then just have to delete empty directories using rmdir.

    I voluntarily added the option -n so you don't do a mess if you copy-paste. Simply remove the option when you think it's good.

        adrien@adrienLT:~/Documents/PEV$ cp -r Holiday/ Holiday_copy/
    adrien@adrienLT:~/Documents/PEV$ tree Holiday*
    Holiday
    ├── France
    │   ├── 1.jpg
    │   ├── 2.jpg
    │   └── 3.jpg
    ├── Italy1
    │   ├── 1.jpg
    │   ├── 2.jpg
    │   └── 3.jpg
    └── Italy2
        ├── 1.jpg
        ├── 2.jpg
        └── 3.jpg
    Holiday_copy
    ├── France
    │   ├── 1.jpg
    │   ├── 2.jpg
    │   └── 3.jpg
    ├── Italy1
    │   ├── 1.jpg
    │   ├── 2.jpg
    │   └── 3.jpg
    └── Italy2
        ├── 1.jpg
        ├── 2.jpg
        └── 3.jpg
    
    6 directories, 18 files
    adrien@adrienLT:~/Documents/PEV$ cd Holiday_copy/
    adrien@adrienLT:~/Documents/PEV/Holiday_copy$ rename "s/(.*)\/(.*)/\$1\/\$1\$2/" */*
    adrien@adrienLT:~/Documents/PEV/Holiday_copy$ tree .
    .
    ├── France
    │   ├── France1.jpg
    │   ├── France2.jpg
    │   └── France3.jpg
    ├── Italy1
    │   ├── Italy11.jpg
    │   ├── Italy12.jpg
    │   └── Italy13.jpg
    └── Italy2
        ├── Italy21.jpg
        ├── Italy22.jpg
        └── Italy23.jpg
    
    3 directories, 9 files