unwrap.sh
· 868 B · Bash
Raw
#!/bin/bash
# This Bash script flattens a directory structure.
# It finds files in subdirectories, moves them to a base directory, and renames them to avoid conflicts. Finally, it removes any directories that become empty after the move.
# Function to move and rename files if necessary
move_and_rename() {
local src_file="$1"
local base_dir="$2"
local filename=$(basename "$src_file")
local dest_file="$base_dir/$filename"
local counter=1
# Rename the file if a file with the same name already exists
while [ -e "$dest_file" ]; do
dest_file="$base_dir/${filename%.*}_$counter.${filename##*.}"
counter=$((counter + 1))
done
mv "$src_file" "$dest_file"
}
export -f move_and_rename
# Find and move files
find . -mindepth 2 -type f -exec bash -c 'move_and_rename "$0" "$PWD"' {} \;
# Remove empty directories
find . -type d -empty -delete
| 1 | #!/bin/bash |
| 2 | # This Bash script flattens a directory structure. |
| 3 | # It finds files in subdirectories, moves them to a base directory, and renames them to avoid conflicts. Finally, it removes any directories that become empty after the move. |
| 4 | |
| 5 | # Function to move and rename files if necessary |
| 6 | move_and_rename() { |
| 7 | local src_file="$1" |
| 8 | local base_dir="$2" |
| 9 | local filename=$(basename "$src_file") |
| 10 | local dest_file="$base_dir/$filename" |
| 11 | local counter=1 |
| 12 | |
| 13 | # Rename the file if a file with the same name already exists |
| 14 | while [ -e "$dest_file" ]; do |
| 15 | dest_file="$base_dir/${filename%.*}_$counter.${filename##*.}" |
| 16 | counter=$((counter + 1)) |
| 17 | done |
| 18 | |
| 19 | mv "$src_file" "$dest_file" |
| 20 | } |
| 21 | |
| 22 | export -f move_and_rename |
| 23 | |
| 24 | # Find and move files |
| 25 | find . -mindepth 2 -type f -exec bash -c 'move_and_rename "$0" "$PWD"' {} \; |
| 26 | |
| 27 | # Remove empty directories |
| 28 | find . -type d -empty -delete |
| 29 |