循环解析最近的文件

循环解析最近的文件

我想解析一下n带有循环的目录中的最新文件for。我考虑过使用ls -t管道连接到 ahead -n<number_of_files>但它不起作用,因为我使用带有空格的文件。

我应该如何修改以下脚本以仅解析n最新文件:

[ -n "$BASH_VERSION" ] && shopt -s nullglob

for f in *; do
    [ -e $f ] && echo $f || continue
done

我正在寻找sh兼容的解决方案。

答案1

您对被(取消)设置进行了检查$BASH_VERSION,对我来说,这表明您可能正在考虑在sh而不是在bash.为此,我们可以省略,nullglob因为代码无论如何都需要检查这种情况。

n=10    # Process no more than this number of files

k=0
for f in *
do
    [ -f "$f" ] || continue
    k=$((k+1))

    # Do stuff with your files as "$f"
    :

    [ $k -ge $n ] && break
done
echo "Files processed: $k"

如果您只想使用,则可以进行一些小更改bash

  • 使用[[ ... ]]而不是[ ... ]
  • k=$((k+1))用。。。来代替((k++))

请注意,我在使用字符串变量的所有地方都用双引号引起来了。这可以保护它的值不被 shell 解析并分成空格上的单词。 (一般来说,使用变量时最好用双引号引起来。)


我重新阅读了您的问题并意识到您想要 N最近修改过的文件。如果您使用 GNU 工具,我会使用它们安全地生成文件列表,但您没有指定这些工具,所以我求助于从ls.一般来说,这不是一个好的做法,主要是因为文件名可以包含非打印字符甚至换行符,但我不知道有更好的非 GNU 解决方案而不需要放入zsh.

n=10    # Process no more than this number of files

k=0
ls -t |
    while IFS= read -r f
    do
        [ -f "$f" ] || continue
        k=$((k+1))

        # Do stuff with your files as "$f"
        :

        [ $k -ge $n ] && break
    done

对于 GNU 工具,我会使用这个有点复杂的管道

find -maxdepth 1 -type f -printf "%T@\t%p\0" |    # Prefix numeric timestamp
    sort -z -k1,2rn |                             # Sort by the timestamp
    cut -z -f2- |                                 # Discard the timestamp
    head -z -n$n |                                # Keep only the top N files
    while IFS= read -r -d '' f
    do
        # Do stuff with your files as "$f"
        :
    done

相关内容