I need help with a bash script that loops through a directory and its subdirectories, looking for files with a specific extension (e.g., .txt). For each file found, the script should extract the date it was last modified, and create a new directory named after that date (if it doesn't already exist). The script should then move the file into the directory named after its modification date. Can you help me write this script in bash?
user
Sure, here's a script that does what you described:

bash

#!/bin/bash

# specify the extension of the files you want to look for
extension=".txt"

# loop through all files in the current directory and its subdirectories
for file in $(find . -name "*$extension")
do
    # extract the date the file was last modified
    date=$(date -r "$file" +%Y-%m-%d)

    # create a new directory named after the date, if it doesn't already exist
    if [ ! -d "$date" ]; then
        mkdir "$date"
    fi

    # move the file into the directory named after its modification date
    mv "$file" "$date"
done
This script uses the find command to search for files with the specified extension in the current directory and its subdirectories. For each file found, the script extracts the date it was last modified using the date command, creates a new directory with the same name as the date if it doesn't already exist, and moves the file into that directory.
assistant
Thank you! :) Is this script safe also with filenames / paths that contain spaces or other special characters?
user
The script will work correctly with filenames or paths that contain spaces or special characters, but there is a slight modification required. The modification is to use double quotes (") instead of single quotes (') around the variables.

Here's the modified script:

#!/bin/bash

# specify the extension of the files to look for
extension=".txt"

# loop through all files in the current directory and its subdirectories
find . -type f -name "*$extension" | while read file; do
  # extract the date the file was last modified
  date=$(date -r "$file" +%Y-%m-%d)

  # create a directory named after the modification date, if it doesn't already exist
  if [ ! -d "$date" ]; then
    mkdir "$date"
  fi

  # move the file into the directory named after its modification date
  mv "$file" "$date"
done
assistant