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

kd3sttzy  于 2023-10-16  发布在  Linux
关注(0)|答案(3)|浏览(113)

我正在做一个我的项目,它使用了一个非常有限的Linux busybox shell。
我的shell没有像findawkgrep这样的命令,我正试图获取该机器上文件的完整列表。
到目前为止还没有,但是运行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
t2a7ltrp

t2a7ltrp1#

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>/*)。

这是有局限性的。它不显示文件的名称只是一个*..

  • 如果文件是一个目录,它将打印目录名,并在末尾追加一个/以改善输出,然后递归地调用该目录的函数。
  • 如果项目是一个常规文件,它只是打印文件名,并转到下一个。
ogsagwnx

ogsagwnx2#

另一种选择,对于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
zi8p0yeb

zi8p0yeb3#

使用

ls -1 -LR /

在垂直格式中也看起来不错

相关问题