删除前导和尾随空白目录

Remove leading and trailing whitespace directories

问题是 Mac OS X 让文件夹的名字像 " Foo Bar /".

这是我自己可以解决的问题,它适用于大多数问题。

for d in */ ; do
    echo "$d" | xargs
done

结果:"Foo Bar /".

唯一的问题是目录名和斜杠之间的最后 space。

有人可以帮助摆脱最后一个 space 吗?

试试这种仅 bash 的方法:

dir="some dir /"
fixed=${dir/ \///}
echo $fixed
some dir/

Bash 字符串操作:

删除字符串开头的子字符串:

${string#substring}         - remove shortest substring match from beginning

${string##substring}        - remove longest substring match from beginning

子字符串删除字符串结尾:

${string%substring}         - remove shortest matching substring from tail 

${string%%substring}        - remove longest matching substring from tail

子字符串替换:

${string/substring/replacement}      - replace first match of substring

${string//substring/greplacement}    - replace all matches of substring

${string/#substring/replacement}     - replace substring at front of string

${string/%substring/replacement}     - replace substring at tail of string

像这样使用 sed 怎么样:

name="    Foo  Bar   /"
echo "$name" | sed 's/^\s*\(.*\)\s*$//g' | tr -s ' '

sed 表达式删除您姓名前后的所有空格,而 tr 将它们压缩到最大值。

The problem is that Mac OS X lets folders get names like " Foo Bar /"

这也是一个 Unix/BASH 问题。所有字符 除了 NUL 和正斜杠都是文件名中的有效字符。这包括控制字符,如 backspace 和 UTF8 字符。

您可以使用 ${WORD%%filter}${WORD##filter} 来帮助删除文件前端和末尾多余的 space。您可能还想用 下划线 字符替换白色 space。如果文件名不包含白色 space:

,Unix shell 脚本通常工作得更好
for file in *
do
   new_file=$(tr -s " "<<<"$file")
   mv "$file" "$new_file"
done

tr -s " "使用tr命令从文件名中挤压spaces。这也会在 Mac OS X 上压缩开始和结束 spaces。这不会删除制表符或 NL(尽管它们可以添加到字符串中。

for file in * 确实将文件名正确分配给 $file<<< 是一种 Bash 主义,允许您将字符串重定向为 STDIN。这很好,因为 tr 仅适用于 STDIN。 $(...) 告诉 Bash 获取该命令的输出并将其插入命令行。

这是一个相当简单的脚本,可能会因其他文件名而窒息。我建议你这样尝试:

for file in *
do
   new_file=$(tr -s " "<<<"$file")
   echo "mv '$file' '$new_file' >> output.txt
done

然后,您可以检查 output.txt 以验证 mv 命令是否有效。验证 output.txt 后,您可以将其用作 bash 脚本:

$ bash output.txt

然后 运行 您保存在 output.txt 中的 mv 命令。