Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash脚本,用于删除目录中所有文件的前导空格和尾随空格_Bash_Macos_Automator - Fatal编程技术网

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

Bash脚本,用于删除目录中所有文件的前导空格和尾随空格,bash,macos,automator,Bash,Macos,Automator,我只想将它添加到Automator中,让用户选择它运行的目录。一个驱动器无法上载有空间的文件。我设法删除了所有空格,但没有从开头和结尾删除所有空格 我的代码: for f in "$1"/*; do dir=$(dirname "$f") file=$(basename "$f") mv "$f" "${dir}/${file//[^0-9A-Za-z.]}" done 注: shell需要用bash而不是sh启动,以确保扩展(如extglobbing和[[]])可用 无需调用d

我只想将它添加到Automator中,让用户选择它运行的目录。一个驱动器无法上载有空间的文件。我设法删除了所有空格,但没有从开头和结尾删除所有空格

我的代码:

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

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

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

如何在Automator中调用它,以便我的用户可以选择运行它的目录?我要一个查找项目。然后将其设置为一个Var,运行一个shell脚本。我不能告诉你——我的专业领域是bash,而不是Automator。但是,如果您能从Automator成功启动您的原始脚本,我希望新脚本也能使用相同的机制。这就是
extglob
的扩展模式匹配选项发挥作用的地方,如果没有它,您最终会得到
file=“${file”${file%%[![:space:]*}”
file=“${file%”${file}[!:space:]}
为了完成同样的事情(要复杂得多…),如果您将变量作为参数传入Automator,而不是stdin(我就是这样),那么它在Automator中非常有效。它似乎只删除前导空格(如果只有一个空格而不是多个空格),而不删除尾随空格(一个或多个)。“extglob”应该正确地删除多个空格,或者我应该使用“${var%%pattern}”-@JacquelineRay,
+([:space:])
是一个可以匹配多个空格的extglob;使用
%%
会导致此代码查找多个。有关此代码在前导和尾随位置使用多个空格的示例,请参阅。如何在Automator中调用它,以便用户可以选择要在其中运行它的目录?我要一个查找项目。然后将其设置为一个Var,运行一个shell脚本。我不能告诉你——我的专业领域是bash,而不是Automator。但是,如果您能从Automator成功启动您的原始脚本,我希望新脚本也能使用相同的机制。这就是
extglob
的扩展模式匹配选项发挥作用的地方,如果没有它,您最终会得到
file=“${file”${file%%[![:space:]*}”
file=“${file%”${file}[!:space:]}
为了完成同样的事情(要复杂得多…),如果您将变量作为参数传入Automator,而不是stdin(我就是这样),那么它在Automator中非常有效。它似乎只删除前导空格(如果只有一个空格而不是多个空格),而不删除尾随空格(一个或多个)。“extglob”应该正确地删除多个空格,或者我应该使用“${var%%pattern}”-@JacquelineRay,
+([:space:])
是一个可以匹配多个空格的extglob;使用
%%
会导致此代码查找多个。有关此代码在前导和尾随位置使用多个空格的示例,请参见。不清楚,但我认为您谈论的是文件名,而不是文件内容。您可以简单地使用
for
while
循环,或
find
-maxdepth 1
(除非您希望递归查找),并且由于您使用的是bash,因此可以使用参数展开来删除前导和尾随空格。这一点不清楚,但我想你说的是文件名,而不是文件内容。您可以简单地使用
for
while
循环,或
find
-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