Iterate through list of filenames in order they were created in bash

前端 未结 8 1753
深忆病人
深忆病人 2020-12-05 19:27

Parsing output of ls to iterate through list of files is bad. So how should I go about iterating through list of files in order by which they were first created

8条回答
  •  情书的邮戳
    2020-12-05 19:45

    sorthelper=();
    for file in *; do
        # We need something that can easily be sorted.
        # Here, we use "".
        # Note that this works with any special characters in filenames
    
        sorthelper+=("$(stat -n -f "%Sm%N" -t "%Y%m%d%H%M%S" -- "$file")"); # Mac OS X only
        # or
        sorthelper+=("$(stat --printf "%Y    %n" -- "$file")"); # Linux only
    done;
    
    sorted=();
    while read -d $'\0' elem; do
        # this strips away the first 14 characters () 
        sorted+=("${elem:14}");
    done < <(printf '%s\0' "${sorthelper[@]}" | sort -z)
    
    for file in "${sorted[@]}"; do
        # do your stuff...
        echo "$file";
    done;
    

    Other than sort and stat, all commands are actual native Bash commands (builtins)*. If you really want, you can implement your own sort using Bash builtins only, but I see no way of getting rid of stat.

    The important parts are read -d $'\0', printf '%s\0' and sort -z. All these commands are used with their null-delimiter options, which means that any filename can be procesed safely. Also, the use of double-quotes in "$file" and "${anarray[*]}" is essential.

    *Many people feel that the GNU tools are somehow part of Bash, but technically they're not. So, stat and sort are just as non-native as perl.

提交回复
热议问题