Bash脚本,用于删除目录中所有文件的前导空格和尾随空格
我只想将它添加到Automator中,让用户选择它运行的目录。一个驱动器无法上载有空间的文件。我设法删除了所有空格,但没有从开头和结尾删除所有空格 我的代码: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
for f in "$1"/*; do
dir=$(dirname "$f")
file=$(basename "$f")
mv "$f" "${dir}/${file//[^0-9A-Za-z.]}"
done
注:
- shell需要用
而不是bash
启动,以确保扩展(如extglobbing和sh
)可用[[]]
- 无需调用
,因为我们总是知道目录名:它在dirname
中$1
语法扩展了正则glob表达式,使其具有与正则表达式相当的能力extglob
是“一个或多个空格”的extglob,而+([[:space:]]
和${var%%pattern}
分别从变量值的后面或前面删除尽可能多的与${var#pattern}
匹配的字符pattern
- 当文件名不需要更改时,没有必要运行
,因此我们可以通过先检查来进行一些优化mv
- shell需要用
而不是bash
启动,以确保扩展(如extglobbing和sh
)可用[[]]
- 无需调用
,因为我们总是知道目录名:它在dirname
中$1
语法扩展了正则glob表达式,使其具有与正则表达式相当的能力extglob
是“一个或多个空格”的extglob,而+([[:space:]]
和${var%%pattern}
分别从变量值的后面或前面删除尽可能多的与${var#pattern}
匹配的字符pattern
- 当文件名不需要更改时,没有必要运行
,因此我们可以通过先检查来进行一些优化mv
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