Bash script to find and display oldest file

前端 未结 4 1253
梦如初夏
梦如初夏 2021-01-21 13:26

I\'m trying to write a script that will display the name of oldest file within the directory that the script is executed from.

This is what I have so far:



        
相关标签:
4条回答
  • 2021-01-21 13:59

    The ls program has an option to sort on time and you can just grab the last file from that output::

    # These are both "wun", not "ell".
    #             v          v
    oldest="$(ls -1t | tail -1)"
    

    If you want to avoid directories, you can strip them out beforehand:

    # This one's an "ell", this is still a "wun".
                  v                         v
    oldest="$(ls -lt | grep -v '^d' | tail -1 | awk '{print $NF}')"
    

    I wouldn't normally advocate parsing ls output but it's fine for quick and dirty jobs, and if you understand its limitations.


    If you want a script that will work even for crazies who insist on putting control characters in their file names :-) then this page has some better options, including:

    unset -v oldest
    for file in "$dir"/*; do
        [[ -z $oldest || $file -ot $oldest ]] && oldest=$file
    done
    

    Though I'd suggest following that link to understand why ls parsing is considered a bad idea generally (and hence why it can be useful in limited circumstances such as when you can guarantee all your files are of the YYYY-MM-DD.log variety for example). There's a font of useful information over there.

    0 讨论(0)
  • 2021-01-21 14:05

    You may use find command: find -type f -printf '%T+ %p\n' | sort | head -1

    0 讨论(0)
  • 2021-01-21 14:11

    The following oneliner finds the oldest file in the whole subtree and reports it using the long format and relative full path. What else could you ever need?

    ls -ltd $(find . -type f) | tail -1
    
    0 讨论(0)
  • 2021-01-21 14:14

    You can use this function to find oldest file/directory in any directory:

    oldest() { 
       oldf=
       for f in *; do
          # not a file, ignore
          [[ ! -f "$f" ]] && continue
          # find oldest entry
          [[ -z "$oldf" ]] && oldf="$f" || [[ "$f" -ot "$oldf" ]] && oldf="$f"
       done
       printf '%s\n' "$oldf"
    }
    

    And call it in any directory as:

    oldest
    
    0 讨论(0)
提交回复
热议问题