循环遍历名称中包含空格的目录

循环遍历名称中包含空格的目录

我正在尝试编写一个脚本,该脚本将循环遍历目录,并重命名子目录中的文件以匹配目录名称。我遇到一个问题,如果目录名称中包含空格,那么该名称就会被分割,我无法像我需要的那样对其执行任何操作。

例如,文件夹结构为:

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是必不可少的,您应该始终引用变量,尤其是当它们包含空格时。

进一步阅读:

相关内容