Come ottenere xargs per non mangiare spazi doppi

2

Sto cercando di elaborare alcuni file con due spazi nel nome. Sembra che xargs stia rimuovendo gli spazi. Esempio

$ echo "foo  bar" | xargs -I {} echo "{}"
foo bar

Notate che c'è solo 1 spazio tra foo e bar ma 2 sono stati passati. L'esempio sopra funziona in Ubuntu 16.04 bash

Nota In realtà sto cercando di elaborare un elenco di file come in

cat list-of-files | xargs -I {} echo "{}"

-O non funziona in questo caso poiché xargs vede l'intero file come un nome di file. Provato -E '\n' ma che ha ancora mangiato lo spazio extra

    
posta gman 07.06.2017 - 19:44
fonte

2 risposte

4

Ecco 3 possibilità che potrebbero funzionare per te:

1. BSD xargs

Questo è incorporato in MacOS, ma ti chiederà di citare i nomi dei file in list-of-files

$ more list-of-files
'file1'
'file2'
'file 3'
'file  4'

nota: ho aggiunto l'opzione -t per mostrare il comando generato prima che venga eseguito.

$ cat list-of-files | xargs -t -I {} echo "{}"
echo file1
file1
echo file2
file2
echo file 3
file 3
echo file  4
file  4

2. GNU xargs

GNU xargs non è installato su MacOS per impostazione predefinita, ma può essere installato tramite homebrew (nel pacchetto findutils).

brew install findutils

L'uso di GNU xargs tramite homebrew non richiede di citare i nomi dei file, e darebbe lo stesso risultato dell'uso di xargs BSD, e citando i nomi dei file (opzione 1, sopra).

3. trova (anziché list-of-files )

Invece di usare un file per il tuo input, usa il comando find . Qualcosa come il seguente dovrebbe funzionare:

$ ls -laF file*
-rw-r--r--  1 sfederman  staff  0 Jun  7 22:53 file  4
-rw-r--r--  1 sfederman  staff  0 Jun  7 22:53 file 3
-rw-r--r--  1 sfederman  staff  0 Jun  7 22:53 file1
-rw-r--r--  1 sfederman  staff  0 Jun  7 22:53 file2

$ find . -name "file*" | xargs -0 -I {} echo "{}"
./file  4
./file 3
./file1
./file2

Oppure, evitando completamente xarg:

$ find . -name "file*" -exec echo "{}" \;
./file  4
./file1
./file2
./file 3
    
risposta data 08.06.2017 - 07:57
fonte
1

Ecco una soluzione per il tuo problema utilizzando sed per racchiudere ogni riga del file con virgolette doppie.

sed 's/\(.*\)/""/' < list-of-files | xargs -I {} echo {}

Funziona anche con GNU xargs .

    
risposta data 08.06.2017 - 15:16
fonte

Leggi altre domande sui tag