在有限的 shell 中列出文件和文件夹层次结构

问题描述 投票:0回答:3

我正在开发一个项目,该项目使用非常有限的 Linux busybox shell。

我的 shell 没有

find
awk
grep
等命令,我正在尝试获取该计算机上的完整文件列表。

到目前为止还没有运气,但是运行

ls -la /*
完成了一半的工作并显示了一层深度的文件。
您知道如何递归运行
ls
来获取文件和文件夹的完整列表吗?也许您知道其他方法吗?

编辑#1:

我的 ls 没有 -R 选项。

ls -1 -LR /

ls: invalid option -- R
BusyBox v1.01 multi-call binary

Usage: ls [-1AacCdeilnLrSsTtuvwxXk] [filenames...]

List directory contents

Options:
    -1  list files in a single column
    -A  do not list implied . and ..
    -a  do not hide entries starting with .
    -C  list entries by columns
    -c  with -l: show ctime
    -d  list directory entries instead of contents
    -e  list both full date and full time
    -i  list the i-node for each file
    -l  use a long listing format
    -n  list numeric UIDs and GIDs instead of names
    -L  list entries pointed to by symbolic links
    -r  sort the listing in reverse order
    -S  sort the listing by file size
    -s  list the size of each file, in blocks
    -T NUM  assume Tabstop every NUM columns
    -t  with -l: show modification time
    -u  with -l: show access time
    -v  sort the listing by version
    -w NUM  assume the terminal is NUM columns wide
    -x  list entries by lines instead of by columns
    -X  sort the listing by extension
linux bash busybox
3个回答
2
投票

BusyBox的页面我可以看到你有

ls
的选项
-R
:

-R 递归列出子目录

所以你可以写:

$ ls -R /

由于您没有

-R
选项,您可以尝试使用如下递归 shell 函数:

myls() {
    for item in "$1"/* "$1"/.*; do
        [ -z "${item##*/.}" -o -z "${item##*/..}" -o -z "${item##*/\*}" ] && continue
        if [ -d "$item" ]; then
            echo "$item/"
            myls "$item"
        else
            echo "$item"
        fi    
    done
}

然后你可以不带参数地调用它,从

/
开始。

$ myls

如果您想从

/home
开始:

$ myls /home

如果你想制作脚本:

#!/bin/sh

# copy the function here

myls "$1"

说明

  • [ -z "${item##*/.}" -o -z "${item##*/..}" -o -z "${item##*/\*}" ] && continue
    此行仅排除目录
    .
    ..
    以及未展开的项目(如果文件夹中没有文件,shell 会将模式保留为
    <some_folder>/*
    )。
    这有一个限制。 它不显示名称只是
    *
    .
    .
  • 的文件
  • 如果文件是目录,它会打印目录名称并在末尾附加
    /
    以改进输出,然后为该目录递归调用该函数。
  • 如果该项目是常规文件,它只会打印文件名并转到下一个。

0
投票

替代方案,对于

BusyBox
,如问题中所注意到的。您可以尝试使用
find
命令递归列出文件。

find /tmp
/tmp
/tmp/vintage_net
/tmp/vintage_net/wpa_supplicant
/tmp/vintage_net/wpa_supplicant/p2p-dev-wlan0
/tmp/vintage_net/wpa_supplicant/wlan0.ex
/tmp/vintage_net/wpa_supplicant/wlan0
/tmp/vintage_net/wpa_supplicant.conf.wlan0
/tmp/resolv.conf
/tmp/beam_notify-89749473
/tmp/nerves_time_comm

-1
投票

使用

ls -1 -LR /

垂直格式看起来也不错

© www.soinside.com 2019 - 2024. All rights reserved.