Bash脚本删除目录中所有文件的前导和尾随空格

时间:2017-08-24 21:31:49

标签: bash macos automator

我想将它添加到Automator中,让用户选择运行它的目录。 One Drive不会上传带空格的文件。我设法删除所有空格但不删除开头和结尾的所有空格。

我的代码:

for f in "$1"/*; do
  dir=$(dirname "$f")
  file=$(basename "$f")
  mv "$f" "${dir}/${file//[^0-9A-Za-z.]}"
done

1 个答案:

答案 0 :(得分:2)

#!/usr/bin/env bash

shopt -s extglob                        # Enable extended globbing syntax
for path in "$1"/*; do
  file=${path##*/}                      # Trim directory name
  file=${file##+([[:space:]])}          # Trim leading spaces
  file=${file%%+([[:space:]])}          # Trim trailing spaces
  if [[ $file != "${path##*/}" ]]; then # Skip files that aren't changed
    mv -- "$path" "$1/${file}"
  fi
done

注意:

  • 需要使用bash启动shell,而不是sh,以确保扩展(例如extglobbing和[[ ]])可用。
  • 无需拨打dirname,因为我们始终知道目录名称:它位于$1
  • extglob语法扩展了常规的glob表达式,使其具有与正则表达式相当的能力。 +([[:space:]])是“一个或多个空格”的extglob,而${var%%pattern}${var##pattern}分别从后面或前面删除尽可能多的匹配pattern的字符变量的值。
  • 当文件名不需要更改时,运行mv是没有意义的,所以我们可以通过先检查来优化一点。