列出写入文件的文件夹的子文件夹
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
有find
和grep
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。
我在 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
; dols /srv/log/$i/
; done
有find
和grep
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。