2008-12-17 13 views
4

J'utilise ls pour obtenir mon nom de fichier qui a un espace blanc il ressemble à quelque chose comme:Linux comment mettre des guillemets doubles autour d'un fichier avant de l'acheminer vers tar?

my file with whitespace.tar.bz2

Je veux tuyau ce goudron semblable à:

ls | grep mysearchstring | tar xvjf 

Comment puis-je insérer deux citations avant de la tuyauterie au goudron?

+0

Je ne pense pas que votre question demande au bonne question. Votre exemple "similaire à" n'ouvrira réellement aucun fichier du répertoire. –

Répondre

7

Un bon outil pour cela est trouver et xargs. Par exemple, vous pouvez utiliser:

find . -name '*.tar.bz2' -print0 | xargs -0 -n1 tar xjf 

Comme suggéré pixelbeat vous pouvez également utiliser le shell comme ceci:

for archive in *.tar.bz2; do tar xvjf "$archive"; done 
+1

trouver | xargs est le plus général et performant. Pour le shell pur, les espaces suivants seront gérés: pour l'archivage dans * .tar.bz2; faire tar xvjf "$ archive" fait – pixelbeat

0

Quel est le problème avec l'expansion shell générique? (En supposant qu'il n'y a qu'un seul nom de fichier.)

% tar -cvf *mysearchstring* 
% tar -xvf *mysearchstring* 

Bien sûr, le nom du fichier qui correspond * mysearchstring * aura des espaces. Mais le shell [tcsh, bash] affectera ce nom de fichier, , y compris ses espaces, à un seul argument de tar.

Vous pouvez vérifier cela avec un simple programme C ou C++. .: par exemple

#include <iostream> 
using namespace std; 
int main(int argc, char **argv) 
{ 
    cout << "argc = " << argc << endl; 
    for (int i = 0; i < argc; i ++) 
    cout << "argv[" << i << "] = \"" << argv[i] << "\"" << endl; 
    return 0; 
} 

Essayez-: ./a.out * foo *

C'est pourquoi HCS a: q option [cité wordlist] ...

Par ex [Tcsh]

foreach FILE (*mysearchstring*) 
    tar -xvf $FILE:q 
end 

Ou tar "$ FICHIER" au lieu de tar $ FILE: q, si vous préférez.


Si vous devez vraiment utiliser ls ...

aide ls quoi que ce soit redirigée vers un nom de fichier sortira par ligne. En utilisant tr, nous pouvons traduire les nouvelles lignes à tout autre caractère, tel que null. xargs peut recevoir des chaînes terminées par zéro. Cela contourne le problème des espaces. L'utilisation de -n1 permettra de résoudre le problème des fichiers multiples.

E.g .: \ ls | grep mysearchstring | tr '\ 012' '\ 0' | xargs --null -n1 tar -xvf

Mais je ne crois le goudron accueille plusieurs tarfiles de stdin comme l'OP a ... il