Search code examples
bashfindtail

how to find every file in my repo that has a specific word in the last line?


In other words, how to combine tail and find/grep command in bash. I want to find all the files(including the files in subdirectories) in my repo have a specific word in the last line, say FIX in the last line. I tried grep -Rl "FIX" to display all the files containing "FIX", but I don't know how to combine the tail command in it. Anyone can help??


Solution

  • Run tail on all the files at once and then grep the output for FIX. Since tail prepends each line with the corresponding file name when given multiple file names, that's all you have to do.

    find -type f -exec tail -n1 {} + | grep FIX
    

    Or use ** to find all files and subdirectories, then run tail on each of them one at a time:

    shopt -s globstar
    for file in **; do
        [[ -f $file ]] && tail -n1 "$file" | grep -q FIX && echo "$file"
    done
    

    Or use find to find all matches and pipe it to a while read loop:

    find -type f -print0 | while IFS= read -rd '' file; do
        tail -n1 "$file" | grep -q FIX && echo "$file"
    done
    

    Or do the same thing but with -exec + and an explicit sub-shell:

    find -type f -exec sh -c 'for file; do tail -n1 "$file" | grep -q FIX && echo "$file"; done' sh {} +