循环浏览文件夹并列出文件


14

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

我写了以下文件列出文件夹中的文件:

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

但这给了我以下输出:

sample/log

sample/clk

sample/demo

它在其中附加了父文件夹。我希望输出如下(没有父文件夹名称)

log

clk

demo

我该怎么做呢?


1
首先使用“ cd”。如果需要“卷曲”,则仍然需要输入目录。您也可以使用它echo ${dir##*/}来摆脱困境。
eexpress

Answers:


32

使用basename剥离最主要的路径关闭的文件:

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

虽然为什么不这样:

( cd sample; ls )

3

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

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

或者您可以直接转到该目录并在那里列出


1
--这里不需要。第一个参数是不带破折号的固定字符串。
库萨兰达

另外,${parameter##pattern}所有POSIX Shell都支持。
库沙兰南达

2

因为* 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

这里的目录是什么?$'\ 0'吗?我想传递变量中的目录...
Soylent Graham

searchDir是目录变量。“ -d $'\ 0'”将读取命令的定界符设置为null。
bb_referee

如何在sh shell中实现同一目的?我正在使用#!/ bin / sh
Ayusman '19

1

这取决于您要对目录执行的操作。

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

ls -1 sample

最好找到,因为您可以使用过滤器:

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

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

find sample -type d -maxdepth 1 -exec basename {} \;
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.