用于在linux中进行文件名转换的Shell脚本

时间:2014-07-03 00:45:06

标签: linux shell unix filenames

我是Unix新手,很少接触shell脚本。我需要提出一个脚本,将文件名从某些字符串值转换为特殊字符。这需要以这种方式运行,子目录下的所有文件也会被重命名。

例如:

来自:abc(GE)xyz(PR).txt更改 收件人:abc> xyz%.txt

我可以为所有必需的特殊字符设置if条件,但我不确定要传递哪些选项以及如何为所有子目录执行此操作。

谢谢, Jeel

1 个答案:

答案 0 :(得分:0)

这是一种方法:

# given a filename, execute any desired replacements.
update_name() {
  local orig_name_var=$1
  local dest_name_var=$2
  local orig_name=${!orig_name_var}
  local new_name="$orig_name"

  new_name=${new_name//(GE)/">"}
  new_name=${new_name//(PR)/"%"} # repeat for additional substitutions

  printf -v "$dest_name_var" "$new_name"
}

while IFS= read -r -d '' orig_name; do
  update_name orig_name new_name
  [[ $orig_name = $new_name ]] && continue

  if ! [[ -e $orig_name ]]; then
    orig_dirname=${orig_name%/*}
    orig_basename=${orig_name##*/}
    update_name orig_dirname new_dirname
    if [[ -e $new_dirname/$orig_basename ]]; then
      # we already renamed the directory this file is in
      orig_name=$new_dirname/$orig_basename
    fi
  fi
  mv -- "$orig_name" "$new_name"
done < <(find . '(' -name '*(GE)*' -o -name '*(PR)*' ')' -print0)