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

问题描述:

我想将它添加到Automator并让用户选择它运行的目录。一个云端硬盘不会上传包含空间的文件。我设法删除所有空格,但不删除从开始和结束的所有空间。Bash脚本删除目录中所有文件的前导和尾部空格

我的代码:

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

目前尚不清楚,但我认为你是在谈论文件*名称*而不是文件*内容*。你可以简单地使用'for'或'while'循环,或者用'-maxdepth 1'来查找''(除非你需要一个递归查找),并且由于你使用的是bash,你可以使用参数扩展去除前导并尾随空白。 –

#!/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 

注:

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

如何在Automator中调用它,以便我的用户可以选择dir来运行它?我要求一个Finder物品。然后将其设置为Var,运行一个shell脚本。 –

+0

不能告诉你 - 我的专长领域是bash,而不是Automator。但是,如果您可以从Automator成功启动原始脚本,则希望使用相同的机制来处理新脚本。 –

+0

这是* extglob *扩展模式匹配*选项的亮点,如果没有它,最终会出现'file =“$ {file#”$ {file %% [![:space:]] *}“}” ''和'file =“$ {file ## * [![:space:]]}}}”'要完成同样的事情(更加麻烦......) –