Bash脚本删除目录中所有文件的前导和尾部空格
我想将它添加到Automator并让用户选择它运行的目录。一个云端硬盘不会上传包含空间的文件。我设法删除所有空格,但不删除从开始和结束的所有空间。Bash脚本删除目录中所有文件的前导和尾部空格
我的代码:
for f in "$1"/*; do
dir=$(dirname "$f")
file=$(basename "$f")
mv "$f" "${dir}/${file//[^0-9A-Za-z.]}"
done
#!/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
毫无意义,所以我们可以通过首先检查来优化一点。
如何在Automator中调用它,以便我的用户可以选择dir来运行它?我要求一个Finder物品。然后将其设置为Var,运行一个shell脚本。 –
不能告诉你 - 我的专长领域是bash,而不是Automator。但是,如果您可以从Automator成功启动原始脚本,则希望使用相同的机制来处理新脚本。 –
这是* extglob *扩展模式匹配*选项的亮点,如果没有它,最终会出现'file =“$ {file#”$ {file %% [![:space:]] *}“}” ''和'file =“$ {file ## * [![:space:]]}}}”'要完成同样的事情(更加麻烦......) –
目前尚不清楚,但我认为你是在谈论文件*名称*而不是文件*内容*。你可以简单地使用'for'或'while'循环,或者用'-maxdepth 1'来查找''(除非你需要一个递归查找),并且由于你使用的是bash,你可以使用参数扩展去除前导并尾随空白。 –