Você não precisa de nenhum pipeline elaborado para isso. Além disso, você não precisa find
nada - você já sabe onde cada arquivo é, você simplesmente não sabe qual deles é o mais novo. Isso é facilmente manipulado.
Para demonstração, aqui está meu pequeno teste:
mkdir ./dir1 ./dir2 ./dir3
for d in 1 2 3
do touch ./dir$d/samefile
sleep 1
done
Isso cria o conjunto de testes. Agora, qual é o mais novo?
set -- ./dir[123]/samefile
while [ -e "$2" ]
do [ "$1" -nt "$2" ] &&
set -- "$@" "$1"
shift; done
printf %s\n "$@"
Isso vai me dizer.
OUTPUT
./dir3/samefile
E eu posso mudar a ordem da operação touch
tanto quanto eu quiser - ela me dará a informação correta. Tudo o que você precisa é de um pequeno loop de shell em uma função como essa:
newd() { ${2:+:} return 1
while [ -e "$2" ] && [ -e "$1" ]
do [ "$1" -nt "$2" ] &&
set -- "$@" "$1"
shift; done
${2+false} cd "${1%/*}"
}
Note que isto é um pouco diferente do demo, por isso falhará com menos de dois argumentos ou se algum argumento não for um caminho real.
Agora você pode chamar assim:
newd ./path/to/file1 ./path/to/file2
... e assim por diante - com tantos argumentos quanto você quiser.
Ou, no meu caso de teste:
newd ./dir[123]/samefile ; pwd
OUTPUT
/home/mikeserv/test/dir3