我有一个文本文件中的目录列表,有人能告诉我如何仅列出文本文件中目录内的文件吗
答案1
您可以使用find
和bash
命令替换为了那个原因:
find $(</path/to/path_file) -type f
这只是列出了f
中提到的每个目录中包含的每个文件/path/to/path_file
。当然,您可以find
进一步调整 的输出,例如通过添加选项-ls
。
示例运行
$ tree
.
├── path_file
├── test1
│ ├── 1
│ └── 2
└── test2
├── 3
└── 4
$ cat path_file
/path/to/test1
/path/to/test2
$ find $(</path/to/path_file) -type f
/path/to/test1/2
/path/to/test1/1
/path/to/test2/4
/path/to/test2/3
我在这里使用绝对路径,因此在哪个目录中调用无关紧要find
。如果path_file
包含相对的您需要在正确的目录中调用它的路径——想象一下在上面的例子里每个路径都/path/to
被替换。.
如果你的路径包含空格,你可以设置内部字段分隔符IFS=$'\n'
在调用之前用换行符find
,这样只有换行符才会被视为路径之间的边界。
如果你想仔细阅读每一行,我强烈建议parallel
,继续find
:
parallel find {} -type f :::: /path/to/path_file
parallel
根据设计正确处理参数中的空格。
答案2
这里有两个问题:一个非常简单 - 列出目录中的文件,另一个可能有点麻烦 -逐行读取文件并将该文件中的行作为参数传递。
经典的方式是通过while IFS= read -r
循环,我们可以添加其他东西
while IFS= read -r line || [ -n "$line" ] ;
do
[ "x$line" = "x" ] && continue
[ -d "./$line" ] && ls "./$line"
done < ./dirs.txt
发生了几件事:
IFS= read -r line
部分将读取一行而不执行单词拆分;这意味着如果您有,<space><space>directory_name
它将被完全按照那样读取,而不仅仅是directory_name
。./
接下来检查所述目录是否存在ls
- 这是为了防止以 开头的文件名-
。诸如 这样的文件名-directory
可能会被命令误解为具有该标志的-d
相应值的标志irectory
;当然,如果命令中不存在这样的标志,这将导致错误。[ "x$line" = "x" ] && continue
将检查空变量/空行。如果变量为空,ls
将输出的内容./
,这是错误的行为。
同一事物的递归情况可以通过find
如甜点所示的方式,或者通过globstar
:
shopt -s globstar
while IFS= read -r line || [ -n "$line" ] ; do
[ "x$line" = "x" ] && continue
[ -d "$line" ] &&
for i in "$line"/** ; do
ls "$i"
done
done < "/path/to/dirs.txt"
答案3
这是一个简单示例从命令行执行此操作:
ls `cat ./dirs.txt`
将“dirs.txt”替换为包含目录列表的文件的名称。dirs.txt
除非您指定路径,否则该文件必须位于当前工作目录中dirs.txt
。要一次列出一个屏幕的文件:
ls `cat ./dirs.txt` | more
这会更加复杂,正如 Sergiy Kolodyazhnyy 在评论中指出的那样,如果dirs.txt
包含的目录中有空格或制表符,这将无法正常工作。
答案4
我并不完全了解脚本,但是for
在脚本的循环内组合其中一个就可以完成你想要做的事情。
列表files only inside a directory
,你可以做以下其中一件事
使用 ls
$ ls -p | grep -v /
OR
$ ls -al | grep '^-'
使用 find
$ find . -maxdepth 1 -type f