删除前导和尾随空白目录

时间:2015-03-30 15:38:08

标签: bash unix whitespace

问题是Mac OS X允许文件夹获得" Foo Bar /"等名称。

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

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

结果:"Foo Bar /"

唯一的问题是它留下了目录名和斜杠之间的最后一个空格。

有人可以帮助摆脱最后的空间吗?

3 个答案:

答案 0 :(得分:2)

尝试使用仅限bash的方法:

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

Bash字符串操作:

删除STRING开始

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

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

SUBSTRING REMORAL STRING STRING

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

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

SUBSTRING REPLACEMENT

${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

答案 1 :(得分:1)

如何使用这样的sed:

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

sed表达式会删除名称前后的所有空格,而tr会将它们最多压缩一次。

答案 2 :(得分:1)

  

问题是Mac OS X让文件夹的名称如“Foo Bar /”

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

您可以使用${WORD%%filter}${WORD##filter}来帮助删除文件正面和结尾的额外空格。您可能还希望用下划线字符替换空格。如果文件名不包含空格,Unix shell脚本通常可以更好地工作:

for file in *
do
   new_file=$(tr -s " "<<<"$file")
   mv "$file" "$new_file"
done

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

for file in *确实将文件名正确分配给$file<<<是一个Bashism,允许您将字符串重定向为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命令。