Diff files present in two different directories

前端 未结 8 2053
你的背包
你的背包 2020-11-30 16:23

I have two directories with the same list of files. I need to compare all the files present in both the directories using the diff command. Is there a simple co

相关标签:
8条回答
  • 2020-11-30 16:45

    Here is a script to show differences between files in two folders. It works recursively. Change dir1 and dir2.

    (search() { for i in $1/*; do [ -f "$i" ] && (diff "$1/${i##*/}" "$2/${i##*/}" || echo "files: $1/${i##*/}   $2/${i##*/}"); [ -d "$i" ] && search "$1/${i##*/}" "$2/${i##*/}"; done }; search "dir1" "dir2" )
    
    0 讨论(0)
  • 2020-11-30 16:50

    If you specifically don't want to compare contents of files and only check which one are not present in both of the directories, you can compare lists of files, generated by another command.

    diff <(find DIR1 -printf '%P\n' | sort) <(find DIR2 -printf '%P\n' | sort) | grep '^[<>]'
    

    -printf '%P\n' tells find to not prefix output paths with the root directory.

    I've also added sort to make sure the order of files will be the same in both calls of find.

    The grep at the end removes information about identical input lines.

    0 讨论(0)
  • 2020-11-30 16:51

    If you are only interested to see the files that differ, you may use:

    diff -qr dir_one dir_two | sort
    

    Option "q" will only show the files that differ but not the content that differ, and "sort" will arrange the output alphabetically.

    0 讨论(0)
  • 2020-11-30 16:54

    diff can not only compare two files, it can, by using the -r option, walk entire directory trees, recursively checking differences between subdirectories and files that occur at comparable points in each tree.

    $ man diff
    
    ...
    
    -r  --recursive
            Recursively compare any subdirectories found.
    
    ...
    
    0 讨论(0)
  • 2020-11-30 17:00

    If it's GNU diff then you should just be able to point it at the two directories and use the -r option.

    Otherwise, try using

    for i in $(\ls -d ./dir1/*); do diff ${i} dir2; done
    

    N.B. As pointed out by Dennis in the comments section, you don't actually need to do the command substitution on the ls. I've been doing this for so long that I'm pretty much doing this on autopilot and substituting the command I need to get my list of files for comparison.

    Also I forgot to add that I do '\ls' to temporarily disable my alias of ls to GNU ls so that I lose the colour formatting info from the listing returned by GNU ls.

    0 讨论(0)
  • 2020-11-30 17:08

    Diff has an option -r which is meant to do just that.

    diff -r dir1 dir2

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