删除前导和尾随空白目录
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
命令。
问题是 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:
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
命令。