问题是Mac OS X允许文件夹获得" Foo Bar /"
等名称。
这是我自己可以解决的问题,它适用于大多数问题。
for d in */ ; do
echo "$d" | xargs
done
结果:"Foo Bar /"
。
唯一的问题是它留下了目录名和斜杠之间的最后一个空格。
有人可以帮助摆脱最后的空间吗?
答案 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
命令。