我正在尝试编写一个脚本,该脚本将循环遍历目录,并重命名子目录中的文件以匹配目录名称。我遇到一个问题,如果目录名称中包含空格,那么该名称就会被分割,我无法像我需要的那样对其执行任何操作。
例如,文件夹结构为:
TopLevel
->this is a test
-->test.txt
到目前为止我的脚本是:
#!/bin/sh
topLevel="/dir1/dir2/TopLevel"
for dir in $(ls $topLevel)
do
echo $dir # for testing purposes to make sure i'm getting the right thing
# Get name of directory - i know how to do this
# Rename file to match the name of the directory, with the existing extension - i know how to do this
done
我的预期输出是
/dir1/dir2/TopLevel/this is a test
然而,实际输出是
this
is
a
test
有人能指出我正确的方向吗?自从我完成 shell 脚本编写以来已经有一段时间了。我试图一次一个地完成这个脚本,但我似乎一直坚持要完成这个迭代。
答案1
这是您应该这样做的主要原因之一永远不要尝试解析输出ls
。如果你只使用 shell glob,你可以这样做:
for dir in /dir1/dir2/TopLevel/*/
do
echo "$dir" ## note the quotes, those are essential
done
评论
请注意我如何使用
for dir in /dir1/dir2/TopLevel/*/
而不仅仅是for dir in /dir1/dir2/TopLevel/*
.这只是迭代目录。如果您想要目录和文件,请使用for f in /dir1/dir2/TopLevel/*
.周围的引号
$dir
是必不可少的,您应该始终引用变量,尤其是当它们包含空格时。
进一步阅读: