循环遍历文件夹并列出文件

循环遍历文件夹并列出文件

我有一个名为“sample”的文件夹,其中有 3 个文件。我想编写一个 shell 脚本,它将读取示例文件夹中的这些文件并使用curl 将其发布到 HTTP 站点。

我编写了以下内容来列出文件夹内的文件:

for dir in sample/*; do
        echo $dir;
        done

但它给了我以下输出:

sample/log

sample/clk

sample/demo

它正在附加其中的父文件夹。我想要的输出如下(没有父文件夹名称)

log

clk

demo

我该怎么做呢?

答案1

用于basename去除文件的前导路径:

for file in sample/*; do
    echo "$(basename "$file")"
done

但为什么不呢:

( cd sample; ls )

答案2

假设您的 shell 支持它,您可以使用参数扩展

for path in sample/*; do
    printf -- '%s\n' "${path##*/}"
done

或者您可以更改到该目录并在那里进行列表

答案3

这取决于您想对目录执行什么操作。

要简单地打印名称,而不检查它是否是目录,您可以使用 ls:

ls -1 sample

更好的是找到,因为你可以使用过滤器:

find sample -type d -maxdepth 1 -printf '%f\n'

如果要对文件运行命令,应使用 find 而不是 for 循环:

find sample -type d -maxdepth 1 -exec basename {} \;

答案4

由于 *nix 系统允许几乎任何字符作为文件名的一部分(包括空格、换行符、逗号、管道符号等),因此您永远不应该在 shell 脚本中解析“ls”命令的输出。这不可靠。看为什么你不应该解析 ls 的输出

使用“查找”创建文件列表。如果您使用的是 Bash,则可以将“find”的输出插入到数组中。下面的示例,但需要注意的是,我使用了不起作用的“curl”命令!

searchDir="sample/"
oldFiles=()
while IFS= read -r -d $'\0' foundFile; do
    oldFiles+=("$foundFile")
done < <(find "$searchDir" -maxdepth 1 -type f -print0 2> /dev/null)

if [[ ${#oldFiles[@]} -ne 0 ]]; then
    for file in "${oldFiles[@]}"; do
        curl -F ‘data=@"$file"’ UPLOAD_ADDRESS
    done
fi

相关内容