如何列出特定目录中的文件

如何列出特定目录中的文件

我有一个文本文件中的目录列表,有人能告诉我如何仅列出文本文件中目录内的文件吗

答案1

您可以使用findbash命令替换为了那个原因:

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

相关内容