Para responder aos requisitos anunciados para este projeto de SOPE, implementamos uma possível solução, em que desenvolvemos 3 aplicações, que visa o desenvolvimento de um programa simples, eficiente, elegante, e de fácil compreensão.
As aplicações que desenvolvemos foram as seguintes: 

lsdir:
Tem a funcionalidade de abrir um diretório, recolher as informações do mesmo e escrevê-las - por defeito, para a saída standard de output. 
A escrita pretende guardar as informações chave do ficheiro, que, por defeito, são guardadas com um espaço. Porém, para separar o nome do ficheiro da informação seguinte, utilizou-se uma barra '/', pois é um símbolo que não pode ser usado para nomear um ficheiro, garantido na totalidade a sua correta leitura posterior.
Por cada diretório encontrado é gerado uma nova instância deste programa, que vai percorrer esse subdiretório.


lssort:
Nesta aplicação, recorreu-se ao uso de uma pipe e do utilitário 'sort', para ordenar o conteúdo que advém de 'lsdir'. Estando 'lsdir' a escrever para a standard output, foi possível redirecionar esta saída para o canal de escrita do pipe.
Por outro lado, em execução paralela, o 'sort' vai receber o conteúdo através do pipe (redirecionando a standard input), e escrever para o ficheiro "files.txt" (também por duplicação de descritores).
A utilização deste método tem duas vantagens:
Não é necessário um ficheiro auxiliar para escrever o conteúdo produzido por 'lsdir', pois é escrito diretamente no pipe.
A ligação entre a escrita do conteúdo de ‘lsdir’ no pipe, e a leitura do mesmo pelo ‘sort’ em execução paralela, torna o processamento de ordenação mais rápido, pois o ‘sort’ não tem que esperar que todo o conteúdo dos ficheiros seja escrito (à medida que ‘lsdir’ escreve, o ‘sort’ recebe a informação).



rmdup:
É responsável por invocar ‘lssort’ e implementa a principal função deste projeto - tornar os ficheiros duplicados em hardlinks para o mais antigo destes.
Pelo facto de “files.txt” estar ordenado, a comparação de linhas é feita com um “ficheiro pivot” e um “ficheiro candidato”: 
para nomes iguais, o ficheiro que se mantém inalterado encontra-se em primeiro (mais antigo), em “files.txt”, pelo que é o nosso pivot.
ficheiros com o mesmo nome, são colocados sempre em linhas adjacentes, em “files.txt”, pelo que, quando o ficheiro candidato tiver um nome diferente do nome do ficheiro pivot, podemos deixar de processar o pivot atual, passando agora o atual candidato a ter esse estatuto.
	Deste modo, é possível processar todos os ficheiros em “files.txt”, sem ser necessário compará-los todos.