【问题标题】:Listing directories with spaces using Bash in linux在 Linux 中使用 Bash 列出带空格的目录
【发布时间】:2014-10-12 22:56:47
【问题描述】:

我想创建一个 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:-.}"/*/

它可以满足我的一切需求。非常感谢!

【问题讨论】:

    标签: linux bash shell


    【解决方案1】:

    我相信这个脚本可以完成你想要的:

    #!/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= read d

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

      如果用户输入反斜杠,shell 将尝试将其作为转义符处理。如果您不喜欢这样,请使用IFS= read -r d,反斜杠将被视为普通字符,而不是转义字符。

    • d=${d:-$PWD}

      如果用户为d 提供了一个值,则保持不变。如果他没有,这会将其分配给$PWD

    • for i in "$d"/*/

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

      相比之下,考虑:

      for i in $(ls -d */)
      

      ls 在此处执行后,shell 会将输出拆分为单个单词。这称为“分词”,这就是为什么应该避免这种形式的for 循环。

      注意for i in "$d"/*/ 中的双引号。他们在那里防止$d上的分词。

    【讨论】:

    • 非常感谢您的回答!我使用了您的输入(预编辑)并提出了一个更短的程序(并且更优雅!)
    • @RobertHowerton 非常好!我刚刚在您的编辑中编辑了我的答案和新脚本,将双引号和IFS= 放在我之前不小心把它们漏掉的地方。他们这样做是为了即使用户提供的目录名称中有空格或制表符,脚本也能正常工作。
    猜你喜欢
    • 2011-10-17
    • 1970-01-01
    • 1970-01-01
    • 2021-07-17
    • 2012-12-30
    • 1970-01-01
    • 1970-01-01
    • 2020-07-22
    • 2019-03-19
    相关资源
    最近更新 更多