列出写入文件的文件夹的子文件夹

List subfolders of folders which are written in file

我在 Linux 服务器上有一个文件夹 /srv/log/,其中我的子文件夹的服务器名称为:

服务器1 服务器2 服务器3 服务器4

我需要一个命令来显示这些文件夹中的内容,但只显示文本文件“del_list”中的特定文件夹:

server2 
server4

我正在尝试使用循环:

for i in `cat del_list`; do `ls /srv/log/$i/`; done

但它只显示了部分服务器和错误:

-bash: folder1: command not found
-bash: folder2: command not found

但还有许多其他文件夹:'folder2, folder3' 那里。但是我无法使用我的命令列出它们,我在这里做错了什么?

for i in `cat del_list`; do ls /srv/log/$i/; done

do

之后的命令周围没有反引号

如果你可以运行一个python脚本:

#! /usr/bin/python3
import subprocess
import os

with open("del_list", "r") as f:
    data = f.read().split(" ")
    
    for file in data:
        filepath = "/srv/log/" + file
        if os.path.isdir(filepath):
            subprocess.check_call("ls " + filepath, shell=True)
        else:
            print("Path " + filepath + " not exist!")

am trying to use a loop: for i in cat del_list; do ls /srv/log/$i/; done

Don't read lines with for

findgrep

find /srv/logs -type d | grep -Ff del_list

现在使用 mapfile 将输出保存在一个数组中,这是一个 bash4+ 功能。

mapfile -t array < <(find /srv/logs -type d | grep -Ff del_list)

现在您可以ls进行交互使用了。

ls "${array[@]}"

最近 bash:

mapfile -t < del_list
ls "${MAPFILE[@]/#//srv/logs/}"

如果您需要对匹配项做一些事情而不仅仅是打印它们,可能会遍历它们:

while IFS= read -r folder; do
    for file in "$folder"/*; do
        : something with "$file"
    done
done <del_list

只要运行一个命令,就可以避免内部循环:

while IFS= read -r folder; do
   ls "$folder"/*
done <del_list

(虽然通常 don't use ls in scripts.)

这对于 Bourne sh / POSIX shell 是可移植的,并且是一个非常基本的 shell 编程习惯用法。

IFS= 可用于防止 shell 打断重要的空格。 read-r 选项可用于禁用在原始 Bourne shell 的 read 命令中实现并保留在 POSIX 中的反斜杠的特殊处理] 出于向后兼容性的原因。并且,与往常一样,除非您特别要求 shell 对值执行分词和通配符扩展,否则您希望 quote variables