find/locate + xargs

Postate qui per tutte le discussioni legate a Linux in generale.

Moderatore: Staff

Regole del forum
1) Citare sempre la versione di Slackware usata, la versione del Kernel e magari anche la versione della libreria coinvolta. Questi dati aiutano le persone che possono rispondere.
2) Per evitare confusione prego inserire in questo forum solo topic che riguardano appunto Gnu/Linux in genere, se l'argomento è specifico alla Slackware usate uno dei forum Slackware o Slackware64.
3) Leggere attentamente le risposte ricevute
4) Scrivere i messaggi con il colore di default, evitare altri colori.
5) Scrivere in Italiano o in Inglese, se possibile grammaticalmente corretto, evitate stili di scrittura poco chiari, quindi nessuna abbreviazione tipo telegramma o scrittura stile SMS o CHAT.
6) Appena registrati è consigliato presentarsi nel forum dedicato.

La non osservanza delle regole porta a provvedimenti di vari tipo da parte dello staff, in particolare la non osservanza della regola 5 porta alla cancellazione del post e alla segnalazione dell'utente. In caso di recidività l'utente rischia il ban temporaneo.
Rispondi
Avatar utente
hendrixiano
Linux 2.x
Linux 2.x
Messaggi: 482
Iscritto il: mer 16 mar 2005, 0:00
Località: Pavia
Contatta:

find/locate + xargs

Messaggio da hendrixiano »

Il problema è questo, se io uso find o locate, per trovare files, questi mi restituiscono un output senza la \ prima degli spazi. Usando xargs per usare l'output come argomento è un po' un casino.
Se c'è un file che si chiama "Jimi Hendrix" e si trova per esempio in ~/music/Hendrix e io voglio farlo partire automaticamente do il comando:

Codice: Seleziona tutto

locate -i "jimi hendrix" | xargs xine
ma se da locate mi esce un output "jimi hendrix" e non "jimi\ hendrix" xine mi farà partire solo "jimi".
Questo non solo con locate ma anche con find.
Grazie ;)

Avatar utente
hendrixiano
Linux 2.x
Linux 2.x
Messaggi: 482
Iscritto il: mer 16 mar 2005, 0:00
Località: Pavia
Contatta:

Messaggio da hendrixiano »

Siccome nessuno mi ha risposto e ho trovato la soluzione (ammetto che non è merito mio ma ho chiesto a Rubini :P ) ve la posto nel caso vi possa essere utile.

Per locate:

Codice: Seleziona tutto

$ locate "mosconi mixed" | tr " " \  | xargs -0 xine
Questa riga dice a locate di cercare il file con le due parole, l'output di locate viene passato a tr che sostituisce lo spazio con il carattere null, l'output di tr viene passato a xargs con lo switch "-0" (che serve a fargli capire che sto usando caratteri null) che usa l'output di tr come argomento per xine.
Sinceramente Rubini usava locate e tr diversamente, certamente con una procedura ( che maledizione a me stesso non mi sono segnato) più elegante della mia, obiettivamente però anche la mia soluzione funziona anche se forse non è poi tanto bella.

Find invece ha già integrato di suo la funzione del carattere null quindi non ha bisogno di tr:

Codice: Seleziona tutto

$ find * -iname "*mosconi* *mixed*" -print0 | xargs -0 xine
Lo switch da utilizzare è -print0.
Evito di fare il commento :P

Capisco che la cosa è decisamente poco utile in quanto si fa prima a dare find o locate e poi dare il percorso a mano però è decisamente soddisfacente :lol:

Rispondi