微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在Linux中使用Bash列出带有空格的目录

我想创建一个bash脚本,以列出用户通过输入提供的目录中的所有目录,或列出当前目录中的所有目录(不提供任何输入).

到目前为止,这就是我所拥有的,但是当我执行它时,我遇到了两个问题.

1)脚本完全忽略了我的输入.该文件位于我的桌面上,但是当我输入“ home”作为输入时,该脚本仅打印桌面的目录(当前目录).

2)目录按行打印(按预期),但会将文件名称中的每个单词视为其自己的文件夹.即打印为:

this
folder

这是我到目前为止的代码

#!/bin/bash

echo -n "Enter a directory to load files: "
read d

if [ $d="" ]; #if input is blank, assume d = current directory
then d=${PWD##*/} 
for i in $(ls -d */);
do echo ${i%%/};
done
else #otherwise, print sub-directories of given directory
for i in $(ls -d */);
do echo ${i%%/};
done
fi

另外,在您的答复中,请解释您的答案,因为我是bash的新手.

感谢您的关注,感谢您的宝贵时间.

编辑:感谢John1024的回答,我提出了以下内容

#!/bin/bash

echo -n "Enter a directory to load files: "
IFS= read d
ls -1 -d "${d:-.}"/*/

它可以满足我的所有需求.非常感激!

解决方法:

我相信此脚本可以实现您想要的功能

#!/bin/sh
ls -1 -d "${1:-.}"/*/

用法示例:

$bash ./script.sh  /usr/X11R6
/usr/X11R6/bin
/usr/X11R6/man

说明:

> -1告诉ls在单独的行上打印每个文件/目录
> -d告诉ls按名称而不是目录列出目录
>如果有一个或,shell将${1:-.}作为脚本的第一个参数. (表示当前目录)(如果没有).

增强功能

上面的脚本在每个目录名称的末尾显示一个/.如果您不想这样做,我们可以使用sed从输出删除尾部斜杠:

#!/bin/sh
ls -1d ${1:-.}/*/ | sed 's|/$||'

脚本的修订版

从脚本开始,可以进行一些简化:

#!/bin/bash
echo -n "Enter a directory to load files: "
IFS= read d
d=${d:-$PWD}
for i in "$d"/*/
do
    echo ${i%%/}
done

笔记:

> IFS =读d

通常,在将输入分配给d之前,先删除开头和结尾的空白.但是,通过将IFS设置为空值,将保留前导空格和尾随空格.因此,即使用户指定名称以空格开头或结尾的目录,这在病理上很奇怪的情况下,这也将起作用.

如果用户输入反斜杠,则外壳程序将尝试将其作为转义符处理.如果您不喜欢,请使用IFS = read -r d,反斜杠将被视为普通字符,而不是转义符.
> d = ${d:-$PWD}

如果用户提供了d的值,则它保持不变.如果他没有,则将其分配给$PWD.
>对于“ $d” / * /中的i

这将遍历$d的每个子目录,并将正确处理带有空格,制表符或任何其他奇数字符的子目录名称.

相比之下,请考虑:

for i in $(ls -d */)

在这里执行ls之后,shell会将输出拆分成单个单词.这称为“单词拆分”,这就是为什么应避免这种形式的for循环的原因.

注意“ $d” / * /中i的双引号.它们在那里是为了防止$d上的单词分裂.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐