遍历目录中的所有内容?

Jac*_*ack 4 osx scripting terminal shell-script

好的,在立即将其作为副本关闭之前,让我解释一下。我尝试了很多方法,例如:

for d in /Applications ; do
   echo "$d"
done
Run Code Online (Sandbox Code Playgroud)

但那又回来了

/应用

而不是 /Applications 的内容。

我也试过:

#!/bin/bash
FILES=/Applications

for file in $FILES
do
   echo $file
done
Run Code Online (Sandbox Code Playgroud)

这基本上是一样的。不过,我注意到,当我这样做时:

#!/bin/bash

for file in *
do
    echo $file
done
Run Code Online (Sandbox Code Playgroud)

它正确地回显了我的主文件夹中的所有文件夹。有谁知道这是怎么回事?

use*_*001 8

要遍历目录中的文件(和子目录),您可以使用

for file in /Applications/*
do
    echo "$file"
done
Run Code Online (Sandbox Code Playgroud)

请注意,如果未找到匹配项,file变量将包含/Applications/*字面上的字符串(带有星号),如果以下命令需要现有路径,则这可能会导致错误。如果没有文件匹配,你什么都不做,你可以使用这个nullglob选项:

shopt -s nullglob
for file in /Applications/*
do
    echo "$file"
done
Run Code Online (Sandbox Code Playgroud)


hee*_*ayl 8

*被称为壳通配符(路径扩展),运营商(?[]太),当你调用它不带引号的,它会扩大到所有在当前目录下的文件(无任何目录前缀)。如果您使用前缀 eg /foo/*,它将被扩展到目录中的所有文件/foo

请注意,它也用于匹配某些文件,例如仅匹配以当前目录开头foo和结尾bar的文件,请使用 glob 模式:

foo*bar
Run Code Online (Sandbox Code Playgroud)

因此,for循环现在可以采用以下形式:

for f in foo*bar; do echo "$f"; done
Run Code Online (Sandbox Code Playgroud)

阅读manshell 页面以获取有关 shell globbing 的更多信息。


G-M*_*ca' 7

  1. 正如Jeff Schaller指出的*通常的工作方式是ls- 它不会显示名称以.(句点)开头的内容。如果你使用bash,你想要得到的东西的名字开始.小号等(打开)SH ELL选择离子dotglob与命令

    shopt -s dotglob
    
    Run Code Online (Sandbox Code Playgroud)

    这将导致*工作ls -A- 它仍然不会显示...他们自己,但会显示以..

  2. 您的问题提到“目录中的所有内容”。这是一个有点模棱两可的短语。如果您的意思是(顶级)/Applications目录中的所有内容,那么其他答案都可以。但是,如果您想要/Applications 树中的所有内容 (即/Applications目录及其子目录中的所有内容),并且您使用的是 bash,请globstar使用以下命令设置 shell 选项

    shopt -s globstar
    
    Run Code Online (Sandbox Code Playgroud)

    这将导致** 作为文件名组件意味着这里和下面的所有内容。所以

    for file in /Applications/**
    do
        echo "$file"
    done
    
    Run Code Online (Sandbox Code Playgroud)

    将列出/Applications 中的所有对象(文件、目录等)。

    请注意,这不能与同一组件级别的其他字符组合;即,你不能做这样的事情foo**bar。但是,您在**. 例如,

    for file in /Applications/**/README
    
    Run Code Online (Sandbox Code Playgroud)

    通过名为所有文件将循环README/Applications树,

    for file in /Applications/**/*.txt
    
    Run Code Online (Sandbox Code Playgroud)

    将查找名称以.txt.

  3. 您可以一次设置多个选项;例如,与

    shopt -s dotglob globstar
    
    Run Code Online (Sandbox Code Playgroud)

    有关完整的选项列表,请参阅 bash 文档。您可以ü NSET的选项shopt -u

  4. 您应该始终引用所有的 shell 变量引用(例如,"$file"),除非您有充分的理由不这样做,并且您确定自己知道自己在做什么。