Rename files adding their parent folder name
In a small python script, renaming files recursively (folders as well as sub folders):
#!/usr/bin/env python3
import shutil
import os
import sys
dr = sys.argv[1]
for root, dirs, files in os.walk(dr):
for f in files:
shutil.move(root+"/"+f, root+"/"+root.split("/")[-1]+f)
How to use
- Copy the script into an empty file, save it as
rename_files.py
-
Run it with the directory as an argument:
python3 /path/to/rename_files.py /directory/with/files
Note
As always, first try on a sample!
Explanation
The script:
- Walks through the directories, looking for files.
-
If files are found, it splits the path to the file with the delimiter "/", keeping the last in the row (which is the parent's folder name) , to be pasted before the file's name:
root.split("/")[-1]
-
Subsequently, move the file to the renamed one:
shutil.move(root+"/"+f, root+"/"+root.split("/")[-1]+f)
Using only shell (bash
) with a little help from mv
:
#!/bin/bash
shopt -s globstar ##globstar will let us match files recursively
files=( /foo/bar/**/*.jpg ) ##Array containing matched files, mention where to search and what files here
for i in "${files[@]}"; do
d="${i%/*}" ##Parameter expansion, gets the path upto the parent directory
d_="${d##*/}" ##gets the name of parent directory
f="${i##*/}" ##gets the file name
echo mv "$i" "$d"/"${d_}""$f" ##renaming, remove echo after confirming what will be changed and you are good
done
Example:
$ shopt -s globstar
$ files=( /foo/bar/**/*.jpg )
$ for i in "${files[@]}"; do d="${i%/*}"; d_="${d##*/}"; f="${i##*/}"; echo mv "$i" "$d"/"${d_}""$f"; done
mv /foo/bar/KT/633-ROYAL/4.jpg /foo/bar/KT/633-ROYAL/633-ROYAL4.jpg
mv /foo/bar/KT/633-ROYAL/5.jpg /foo/bar/KT/633-ROYAL/633-ROYAL5.jpg
mv /foo/bar/KT/633-ROYAL/6.jpg /foo/bar/KT/633-ROYAL/633-ROYAL6.jpg
mv /foo/bar/KT/633-ROYAL/BLUE-MULTI/1.jpg /foo/bar/KT/633-ROYAL/BLUE-MULTI/BLUE-MULTI1.jpg
mv /foo/bar/KT/633-ROYAL/BLUE-MULTI/2.jpg /foo/bar/KT/633-ROYAL/BLUE-MULTI/BLUE-MULTI2.jpg
mv /foo/bar/KT/633-ROYAL/BLUE-MULTI/3.jpg /foo/bar/KT/633-ROYAL/BLUE-MULTI/BLUE-MULTI3.jpg