Come si passa un file o una cartella contenente spazi bianchi come argomento a un programma da riga di comando in un ambiente GNU / Linux o Cygwin?


1

Ci sono occasioni in cui lavori con file e cartelle che contengono spazi al loro interno. Il problema si verifica ogni volta che si tenta di reindirizzare file / cartelle contenenti spazi bianchi a un altro programma da riga di comando, i file / cartelle contenenti spazi bianchi vengono interpretati come argomenti separati anziché come un singolo argomento. Ad esempio, considerare il seguente albero di directory:

Folder With Spaces
Folder With Spaces/FolderWithoutSpaces
Folder With Spaces/FolderWithoutSpaces/file with spaces.txt
FolderWithoutSpaces
FolderWithoutSpaces/fileWithoutSpaces.txt

Se si tenta di eseguire un comando shell come "grep 'some text' $ (find. -Type f)", si otterrà il seguente output:

grep: ./Folder: No such file or directory
grep: With: No such file or directory
grep: Spaces/FolderWithoutSpaces/file: No such file or directory
grep: with: No such file or directory
grep: spaces.txt: No such file or directory

La grande domanda è: come si reindirizzano file / cartelle che contengono spazi bianchi come argomenti a un programma da riga di comando?

Risposte:


7

Faresti meglio a usare l' -execazione (opzione) di find e citare i tuoi argomenti.

Esempio:

find . -type f -exec grep stuff '{}' \;

Le virgolette eviteranno che gli spazi vengano interpretati e non è necessario reindirizzare tutto xargsinutilmente.

Dalla findpagina man:

-exec comando ;

    Esegui comando ; vero se viene restituito lo stato 0. Tutti i seguenti argomenti finddevono essere considerati argomenti per il comando fino a quando non ;viene rilevato un argomento costituito da " ". La stringa ' {}' viene sostituita dal nome del file corrente che viene elaborato ovunque si presenti negli argomenti del comando, non solo negli argomenti in cui è solo, come in alcune versioni di find. Entrambe queste costruzioni potrebbero aver bisogno di essere salvate (con un ' \') o quotate per proteggerle dall'espansione della shell. Vedere la sezione ESEMPI per esempi sull'uso -execdell'opzione. Il comando specificato viene eseguito una volta per ciascun file corrispondente. Il comando viene eseguito nella directory iniziale.

    Ci sono inevitabili problemi di sicurezza che circondano l'uso -execdell'azione; dovresti invece usare l' -execdiropzione.


Uso -exec su base routinaria, ma per qualche motivo non mi è mai venuto in mente di mettere semplicemente le virgolette tra parentesi!
rmiesen,

In realtà, inserire le {}virgolette non ha nulla a che fare con la gestione dei nomi che contengono spazi.
G-Man,

3

Installa i tuoi argomenti usando xargs delimitando gli argomenti della riga di comando nel programma precedente con un carattere null che passa l'opzione "-0" a xargs, come segue:

find . -type f -print0 | xargs -0 grep -l "some text"

Questo comando passerà in tutti i file / cartelle con spazi bianchi come argomenti singoli anziché argomenti separati.


2

Utilizzare il carattere barra rovesciata '\' che precede lo spazio bianco:

[randerson@localhost ~]$ mkdir Folder\ With\ Spaces
[randerson@localhost ~]$ ls | grep Folder\ With\ Spaces
Folder With Spaces
[randerson@localhost ~]$ 

1

Racchiudere i nomi dei file tra virgolette (singole o doppie):

$ mkdir "Folder With Spaces"
$ ls | grep "Folder With Spaces"
Folder With Spaces
$ ls | grep 'Folder With Spaces'
Folder With Spaces

La shell espanderà le variabili tra virgolette doppie:

$ FOO=With
$ ls | grep "Folder $FOO Spaces"
Folder With Spaces

Puoi anche citare le $(...)espansioni se il risultato è un singolo nome file:

$ ls -d "$(echo -n Folder With Spaces)"
Folder With Spaces

Funzionerà solo con nomi di file singoli; per più file, utilizzare find -execo xargscome suggerito nelle altre risposte.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.