Difference between revisions of "Comparing files"
Jump to navigation
Jump to search
(Use "source" tag instead of "syntaxhighlight") |
|||
Line 3: | Line 3: | ||
The script below takes two arguments on the command-line and compares them via <code>[https://en.wikipedia.org/wiki/Diff diff]</code> command. It also echoes generic human-readable answer saying whether two file system objects are equal. As <code>diff</code> compares directories as well as files, paths to directories are valid arguments as well. | The script below takes two arguments on the command-line and compares them via <code>[https://en.wikipedia.org/wiki/Diff diff]</code> command. It also echoes generic human-readable answer saying whether two file system objects are equal. As <code>diff</code> compares directories as well as files, paths to directories are valid arguments as well. | ||
− | < | + | <source lang="bash"> |
#!/bin/bash | #!/bin/bash | ||
Line 35: | Line 35: | ||
echo 'Not equal' | echo 'Not equal' | ||
fi | fi | ||
− | </ | + | </source> |
== Plugging the script into vifm == | == Plugging the script into vifm == |
Revision as of 14:44, 28 July 2014
Comparison script
The script below takes two arguments on the command-line and compares them via diff
command. It also echoes generic human-readable answer saying whether two file system objects are equal. As diff
compares directories as well as files, paths to directories are valid arguments as well.
#!/bin/bash
if [ $# != 2 ] ; then
echo 'Expected exactly two arguments'
exit 1
fi
if [ -f "$1" -a -f "$2" ]; then
: # OK, do nothing here
elif [ -d "$1" -a -d "$2" ]; then
: # OK, do nothing here
else
if [ -f "$1" ]; then
type_of_1='file'
else
type_of_1='directory'
fi
if [ -f "$2" ]; then
type_of_2='file'
else
type_of_2='directory'
fi
echo "Arguments are of different type ($type_of_1/$type_of_2)"
exit 1
fi
if diff "$1" "$2" > /dev/null 2>&1; then
echo 'Equal'
else
echo 'Not equal'
fi
Plugging the script into vifm
To use it in Vifm:
- Save the script as
compare-cmd
(notcmp
orcompare
to avoid name conflict with existing tools) at one of directories listed in your$PATH
environment variable or under$VIFM/scripts
(most likely that it's~/.vifm/scripts
). - On Unix-like operating systems make the script file executable by running
chmod +x compare-cmp
- Add following lines to your
vifmrc
:
command! cmpinternal compare-cmd %a %S
command! cmp : if expand('%c') == expand('%f')
\ | echo expand('Comparing %"c and %"C:t ...')
\ | cmpinternal %c %C
\ | else
\ | echo expand('Comparing files: %"f ...')
\ | cmpinternal %f
\ | endif
Explanation of key parts:
cmpinternal
— a trick to invoke external command. Callingexecute "!compare-cmd ... %S"
reparses command-line which leads to loosing results of command execution (they are overwritten by execution ofif-else-endif
block).expand('%c') == expand('%f')
— check whether only one file is selected in current pane.
Usage
- Run
:cmp
without selection or with single file selection to compare files under cursors in two panes. - Run
:cmp
after selecting two files in the current pane to compare them.
Results are printed on the status bar (because of %S
macro in cmdinternal
).