Repository 32bit  Forum
Repository 64bit  Wiki

Xargs con nomi e spazi

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.

Xargs con nomi e spazi

Messaggioda Meskalamdug » ven gen 20, 2012 21:38

Semplice semplice...
se do
find /home -iname *prova*|xargs rm
cancello tutti i prova,es prova.mp3 prova prova12
ma non
prova prova.txt prova com.mp3
Insomma,i nomi con spazi.
Come risolvere?
Grazie
Meskalamdug
Iper Master
Iper Master
 
Messaggi: 3575
Iscritto il: gio mag 13, 2004 23:00

Re: Xargs con nomi e spazi

Messaggioda 414N » ven gen 20, 2012 21:46

Come prima cosa, forse devi eseguire anche l'escape degli asterischi.
Dalla man page di xargs:
Codice: Seleziona tutto
       Because  Unix filenames can contain blanks and newlines, this default behaviour is
       often problematic; filenames containing blanks  and/or  newlines  are  incorrectly
       processed  by xargs.  In these situations it is better to use the -0 option, which
       prevents such problems.   When using this option you will need to ensure that  the
       program which produces the input for xargs also uses a null character as a separa-
       tor.  If that program is GNU find for example, the -print0 option  does  this  for
       you.

Dovrebbe quindi bastarti l'opzione -print0 di find e il flag -0 di xargs.
Avatar utente
414N
Iper Master
Iper Master
 
Messaggi: 2877
Iscritto il: mer feb 13, 2008 16:19
Località: Bulagna
Slackware: 14.0 (x64)
Kernel: 3.2.29
Desktop: LXDE

Re: Xargs con nomi e spazi

Messaggioda Meskalamdug » ven gen 20, 2012 22:53

414N ha scritto:Come prima cosa, forse devi eseguire anche l'escape degli asterischi.
Dalla man page di xargs:
Codice: Seleziona tutto
       Because  Unix filenames can contain blanks and newlines, this default behaviour is
       often problematic; filenames containing blanks  and/or  newlines  are  incorrectly
       processed  by xargs.  In these situations it is better to use the -0 option, which
       prevents such problems.   When using this option you will need to ensure that  the
       program which produces the input for xargs also uses a null character as a separa-
       tor.  If that program is GNU find for example, the -print0 option  does  this  for
       you.

Dovrebbe quindi bastarti l'opzione -print0 di find e il flag -0 di xargs.

Xargs col -0 non funziona.
Meskalamdug
Iper Master
Iper Master
 
Messaggi: 3575
Iscritto il: gio mag 13, 2004 23:00

Re: Xargs con nomi e spazi

Messaggioda targzeta » sab gen 21, 2012 9:29

Guarda che funziona. Solo che, come ti ha detto 414N, devi anche settare l'opzione '-print0' per find.

Emanuele
Linux Registered User #454438
Se pensi di essere troppo piccolo per fare la differenza, prova a dormire con una zanzara -- Dalai Lama
20/04/2013 - Io volevo Rodotà
Avatar utente
targzeta
Iper Master
Iper Master
 
Messaggi: 6146
Iscritto il: gio nov 03, 2005 14:05
Località: Carpignano Sal. (LE) <-> Pisa
Nome Cognome: Emanuele Tomasi
Slackware: current
Kernel: latest stable
Desktop: IceWM

Re: Xargs con nomi e spazi

Messaggioda Meskalamdug » sab gen 21, 2012 16:12

spina ha scritto:Guarda che funziona. Solo che, come ti ha detto 414N, devi anche settare l'opzione '-print0' per find.

Emanuele

Ho capito male,quindi sono 2 opzioni.
Grazie per l'aiuto.
Meskalamdug
Iper Master
Iper Master
 
Messaggi: 3575
Iscritto il: gio mag 13, 2004 23:00

Re: Xargs con nomi e spazi

Messaggioda Meskalamdug » sab gen 21, 2012 16:14

L'ho usata..e ha cancellato tutto :(
Meskalamdug
Iper Master
Iper Master
 
Messaggi: 3575
Iscritto il: gio mag 13, 2004 23:00

Re: Xargs con nomi e spazi

Messaggioda targzeta » sab gen 21, 2012 16:31

Meskalamdug ha scritto:L'ho usata..e ha cancellato tutto :(

In che senso? Prima di dare un rm devi sempre controllare l'output di find. Ma come mai ti ha cancellato tutto? Ho appena fatto una prova e a me ha funzionato correttamente:
Codice: Seleziona tutto
$> ls /tmp
Serra-DonBosco
prova 1.mp3
prova casa.mp3
prova.js
sfondo.txt

$> find /tmp/ -iname "*prova*" -print0 | xargs -0 rm

$> ls -1 /tmp/
Serra-DonBosco
sfondo.txt

Emanuele
Linux Registered User #454438
Se pensi di essere troppo piccolo per fare la differenza, prova a dormire con una zanzara -- Dalai Lama
20/04/2013 - Io volevo Rodotà
Avatar utente
targzeta
Iper Master
Iper Master
 
Messaggi: 6146
Iscritto il: gio nov 03, 2005 14:05
Località: Carpignano Sal. (LE) <-> Pisa
Nome Cognome: Emanuele Tomasi
Slackware: current
Kernel: latest stable
Desktop: IceWM

Re: Xargs con nomi e spazi

Messaggioda Meskalamdug » sab gen 21, 2012 16:59

spina ha scritto:
Meskalamdug ha scritto:L'ho usata..e ha cancellato tutto :(

In che senso? Prima di dare un rm devi sempre controllare l'output di find. Ma come mai ti ha cancellato tutto? Ho appena fatto una prova e a me ha funzionato correttamente:
Codice: Seleziona tutto
$> ls /tmp
Serra-DonBosco
prova 1.mp3
prova casa.mp3
prova.js
sfondo.txt

$> find /tmp/ -iname "*prova*" -print0 | xargs -0 rm

$> ls -1 /tmp/
Serra-DonBosco
sfondo.txt

Emanuele

Io avevo messo print0 prima di iname...sarà quello lo sbaglio?
Meskalamdug
Iper Master
Iper Master
 
Messaggi: 3575
Iscritto il: gio mag 13, 2004 23:00

Re: Xargs con nomi e spazi

Messaggioda targzeta » lun gen 23, 2012 10:06

Sì, mi sa che l'errore è stato proprio quello. L'opzione '-print0' dice a find di stampare quello che trova, però se prima non hai filtrato i risultati con '-iname' allora ti stanpa tutto.

Il punto chiave qui è che find lavora con la catena di filtri che gli passi sulla command line, tutti i filtri sono messi in and di default e vengono usati così come glieli passi tu.

Nel mio caso tutti i risultati trovati vengono filtrati da 'iname' e quindi il sottoisieme che passa questo filtro si "scontra" con 'print0'. Nel tuo caso invece i risultati sono stampati prima ancora di essere filtrati.

Emanuele
Linux Registered User #454438
Se pensi di essere troppo piccolo per fare la differenza, prova a dormire con una zanzara -- Dalai Lama
20/04/2013 - Io volevo Rodotà
Avatar utente
targzeta
Iper Master
Iper Master
 
Messaggi: 6146
Iscritto il: gio nov 03, 2005 14:05
Località: Carpignano Sal. (LE) <-> Pisa
Nome Cognome: Emanuele Tomasi
Slackware: current
Kernel: latest stable
Desktop: IceWM

Re: Xargs con nomi e spazi

Messaggioda Meskalamdug » lun gen 23, 2012 15:29

spina ha scritto:Sì, mi sa che l'errore è stato proprio quello. L'opzione '-print0' dice a find di stampare quello che trova, però se prima non hai filtrato i risultati con '-iname' allora ti stanpa tutto.

Il punto chiave qui è che find lavora con la catena di filtri che gli passi sulla command line, tutti i filtri sono messi in and di default e vengono usati così come glieli passi tu.

Nel mio caso tutti i risultati trovati vengono filtrati da 'iname' e quindi il sottoisieme che passa questo filtro si "scontra" con 'print0'. Nel tuo caso invece i risultati sono stampati prima ancora di essere filtrati.

Emanuele

Capito.
Meskalamdug
Iper Master
Iper Master
 
Messaggi: 3575
Iscritto il: gio mag 13, 2004 23:00

Re: Xargs con nomi e spazi

Messaggioda 414N » lun gen 23, 2012 15:36

Non ho capito una cosa, però: perché non usi l'opzione -delete (oppure -exec rm {} \;) di find per cancellare direttamente i risultati della ricerca, senza bisogno di pipe?
Codice: Seleziona tutto
find /path -iname pattern -delete
find /path -iname pattern -exec rm {} \;

Oppure l'intento era esercitarsi ad usare xargs?
Avatar utente
414N
Iper Master
Iper Master
 
Messaggi: 2877
Iscritto il: mer feb 13, 2008 16:19
Località: Bulagna
Slackware: 14.0 (x64)
Kernel: 3.2.29
Desktop: LXDE

Re: Xargs con nomi e spazi

Messaggioda targzeta » lun gen 23, 2012 16:03

In realtà, l'uso di xargs è consigliato per una questione di numero di processi da eseguire. Se usi l'opzione '-exec' di find, allora, per ogni cosa che arriva al filtro 'exec', find avvia un processo. Mettendo l'output di find in pipe con xargs, invece, hai solo tre processi che vengono eseguiti, per l'appunto find, xargs e il comando che viene eseguito da xargs.

Per l'esempio in questione con rm, se i file da cancellare sono tre, con l'opzione 'exec' e come se facessi:
Codice: Seleziona tutto
rm file1
rm file2
rm file3
invece usando xargs:
Codice: Seleziona tutto
rm file1 file2 file3

Questo è come l'ho imparato io, poi non so se ci sono altre motivazioni,
Emanuele
Linux Registered User #454438
Se pensi di essere troppo piccolo per fare la differenza, prova a dormire con una zanzara -- Dalai Lama
20/04/2013 - Io volevo Rodotà
Avatar utente
targzeta
Iper Master
Iper Master
 
Messaggi: 6146
Iscritto il: gio nov 03, 2005 14:05
Località: Carpignano Sal. (LE) <-> Pisa
Nome Cognome: Emanuele Tomasi
Slackware: current
Kernel: latest stable
Desktop: IceWM

Re: Xargs con nomi e spazi

Messaggioda Meskalamdug » lun gen 23, 2012 16:34

414N ha scritto:Non ho capito una cosa, però: perché non usi l'opzione -delete (oppure -exec rm {} \;) di find per cancellare direttamente i risultati della ricerca, senza bisogno di pipe?
Codice: Seleziona tutto
find /path -iname pattern -delete
find /path -iname pattern -exec rm {} \;

Oppure l'intento era esercitarsi ad usare xargs?

La seconda.
:)
Meskalamdug
Iper Master
Iper Master
 
Messaggi: 3575
Iscritto il: gio mag 13, 2004 23:00

Re: Xargs con nomi e spazi

Messaggioda Meskalamdug » gio mar 08, 2012 19:56

Ecco una buona soluzione

Codice: Seleziona tutto
slocate nomeconspazi|sed 's/ /\\ /g'|xargs cat
Meskalamdug
Iper Master
Iper Master
 
Messaggi: 3575
Iscritto il: gio mag 13, 2004 23:00


Torna a Gnu/Linux in genere

Chi c’è in linea

Visitano il forum: Exabot [Bot] e 2 ospiti