In bash it is possible to test whether one file is older or newer than the other:
if [ file1 -nt file2 ]; then # do something fi if [ file3 -ot file4 ]; then # do something fi
However, the man page does not say what happens if one of the files does not exist. Experiment shows that at least on my systems (Ubuntu 16.04 and 18.04) non-existing files are consistently treated as created in the infinite past. I.e., any existing file is newer than non existing file, and any non existing file is older than any existing file. The results are summarized in the table below:
[ existing -nt missing ] ==> TRUE [ missing -nt existing ] ==> FALSE [ existing -ot missing ] ==> FALSE [ missing -ot existing ] ==> TRUE [ missing -nt missing ] ==> FALSE [ missing -ot missing ] ==> FALSE
BTW, here’s the script that prints this table:
#!/bin/bash function compare { echo -n "[ $1 $2 $3 ] ==> " if [ $1 $2 $3 ]; then echo TRUE; else echo FALSE; fi } touch existing compare existing -nt missing compare missing -nt existing compare existing -ot missing compare missing -ot existing compare missing -nt missing compare missing -ot missing
Permalink
Good exercise in phylosophy. Do non existent objects belong to the (distant) past or to the future?
Permalink
For practical purposes, past makes more sense, as main usage of this comparison is, I assume, updating dependencies: “if [ dest -ot src ]; then recreate dest from src; fi
In this case, if dest does not exist, we also want to create it.
Permalink
Absolutely! Great explanation.