简体   繁体   中英

Renaming directories based on a pattern in Bash

I have a Bash script that works well for just renaming directories that match a criteria.

for name in *\[*\]\ -\ *; do
  if [[ -d "$name" ]] && [[ ! -e "${name#* - }" ]]; then
    mv "$name" "${name#* - }"
  fi
done

Currently if the directory looks like:

user1 [files.sentfrom.com] - Directory-Subject

It renames the directory and only the directory to look like

Directory-Subject (this could have different type of text)

How can I change the script / search criteria to now search for

www.ibm.com - Directory-Subject

and rename the directory and only the directory to

Directory-Subject

You could write your code this way so that it covers both the cases:

for dir in *\ -\ *; do
  [[ -d "$dir" ]] || continue   # skip if not a directory
  sub="${dir#* - }"
  if [[ ! -e "$sub" ]]; then
    mv "$dir" "$sub"
  fi
done

Before running the script:

$ ls -1d */
user1 [files.sentfrom.com] - Directory-Subject/
www.ibm.com - Directory-Subject

After:

$ ls -1d */
Directory-Subject/
www.ibm.com - Directory-Subject/   # didn't move because directory existed already

A simple answer would be to change *\\[*\\]\\ -\\ * to *\\ -\\ *

for name in *\ -\ *; do
  if [[ -d "$name" ]] && [[ ! -e "${name#* - }" ]]; then
    mv "$name" "${name#* - }"
  fi
done

For more information, please read glob and wildcards

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