I learned (thanks!) to use the join feature built into the layer properties, but in my case it doesn't work because data do not match perfectly. Infact shape refers to geotagged photos, csv is a log file which contains orientation data (azimuth); I would like to join them by date field (day, hours, seconds): I would need to join the "nearest" data, non spatially but temporally!
Never faced a problem like this before, and it seems difficult to resolve without coding. Maybe, you could import both the shapefile and the csv in a geodatabase (i.e. PostGIS), and then use SQL and nested queries to create the result you want. The query could use the functions for managing dates and times of the DBMS in order to get the difference in seconds from a date in the 'shapefile' table and all the dates in the 'log' table: you only need to do it in a nested query, order the results (ascending) of the nested query based on this calculated value and then take the first record you get and insert it in the main query, executed against the shapefile table. This procedure is not simple, but could allow you to solve the problem.