简体   繁体   中英

How to pass files to a script that processes folders

So I have this bash script which will rename all the files from the current directory. I need help modifying it so I can instead specify only certain files which will be renamed, but also still have the ability to pass it a directory instead. I'm not super familiar with bash so it's fairly confusing to me.

#!/bin/bash

#
# Filename: rename.sh
# Description: Renames files and folders to lowercase recursively
#              from the current directory
# Variables: Source = x
#            Destination = y

#
# Rename all directories. This will need to be done first.
#

# Process each directory’s contents before the directory  itself
for x in `find * -depth -type d`;
do

  # Translate Caps to Small letters
  y=$(echo $x | tr '[A-Z]' '[a-z]');

  # check if directory exits
  if [ ! -d $y ]; then
    mkdir -p $y;
  fi

  # check if the source and destination is the same
  if [ "$x" != "$y" ]; then

    # check if there are files in the directory
    # before moving it
    if [ $(ls "$x") ]; then
      mv $x/* $y;
    fi
    rmdir $x;

  fi

done

#
# Rename all files
#
for x in `find * -type f`;
do
  # Translate Caps to Small letters
  y=$(echo $x | tr '[A-Z]' '[a-z]');
  if [ "$x" != "$y" ]; then
    mv $x $y;
  fi
done

exit 0

Your script has a large number of beginner errors, but the actual question in the title has some merit.

For a task like this, I would go for a recursive solution.

tolower () {
    local f g
    for f; do
        # If this is a directory, process its contents first
        if [ -d "$f" ]; then
            # Recurse -- run the same function over directory entries
            tolower "$f"/*
        fi
        # Convert file name to lower case (Bash 4+)
        g=${f,,}
        # If lowercased version differs from original, move it
        if [ "${f##*/}" != "${g##*/}" ]; then
            mv "$f" "$g"
        fi
    done
}

Notice how variables which contain file names always need to be quoted (otherwise, your script will fail on file names which contain characters which are shell metacharacters) and how Bash has built-in functionality for lowercasing a variable's value (in recent versions).

Also, tangentially, don't use ls in scripts and try http://shellcheck.net/ before asking for human debugging help.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM