2012-11-27 5 views
2

J'essaie de créer un lien symbolique (lien mou) à partir des résultats d'une commande find. J'utilise sed pour supprimer le ./ qui précède le nom de fichier. Je fais ceci afin que je puisse coller le nom de fichier à la fin du chemin où le lien sera sauvé. Je travaille sur ce sujet avec Ubuntu Server 8.04.Créer un lien symbolique à partir de la recherche

I appris de ce poste, qui est une sorte de solution à mon problème, mais pas quite-

How do I selectively create symbolic links to specific files in another directory in LINUX?

Le nom du fichier résultant ne fonctionne pas, cependant, alors j'ai commencé à essayer d'apprendre awk et ensuite décidé de sed. J'utilise une boucle d'une ligne pour accomplir ceci. Le problème est que la structure de la boucle sépare le nom de fichier, créant un lien pour chaque mot dans le nom de fichier. Il y a quelques fichiers et je voudrais automatiser le processus avec chaque lien prenant le nom du fichier auquel il est lié. Je suis à l'aise avec les commandes bash basiques mais je suis loin d'être un expert en ligne de commande. J'ai commencé avec ls et awk et j'ai déménagé pour trouver et sed. Ma syntaxe sed pourrait probablement être meilleure, mais j'ai appris cela en deux jours et je suis coincé maintenant.

T dans find -type f -name "*txt*" | sed -e 's/.//' -e 's$/$$'; do echo ln -s $t ../folder2/$t; fait

Toute aide ou des conseils seraient grandement appréciés. Merci.

+0

Vous pouvez éviter le '/' dans la sortie de 'find' en passant une liste. des chemins. 'find */-options ...' Je suppose qu'il peut y avoir une option pour cela aussi. – tripleee

+0

Le problème avec les liens non fonctionnels est que les noms de chemins relatifs doivent être relatifs à la destination du lien. Réécrire pour démarrer la boucle un répertoire vers le haut ('trouver la source -options ... -exec ln -s '{}' target \;'), utiliser les chemins absolus, ou étendre votre script 'sed' pour résoudre la cible du lien par rapport à la destination (ajouter trivialement '../ source /' devant). Le premier argument de 'ln -s' n'est pas réécrit en aucune façon, il est utilisé textuellement comme le contenu du lien symbolique, il n'y a aucune exigence ou vérifier qu'il résout dans un fichier existant au moment de la création du lien. – tripleee

+0

Je pense que vous voulez dire 'sed 's%^\ ./%%' '. Pour autoriser une barre oblique dans la regex, 'sed' vous permet d'utiliser n'importe quel caractère de ponctuation après la commande' s', bien qu'une barre oblique soit le délimiteur par défaut traditionnel, imitant le caractère de recherche dans 'vi', et' ed' avant il. Alternativement, vous pouvez backslash-échapper le délimiteur pour le citer comme un caractère littéral dans l'expression. – tripleee

Répondre

2

exécuter votre boucle comme ceci:

(IFS=$'\n'; for t in `find -type f -name "*txt*" | sed 's|.*/||'`; do ln -s $t ../folder2/$t; done) 

En réglant l'IFS seulement une nouvelle ligne, vous devriez être en mesure de lire le nom du fichier entier sans se espace à fente. Les parenthèses doivent s'assurer que la boucle est exécutée dans un sous-shell et que l'IFS du shell actuel n'est pas modifié.

+0

Merci! C'est ce que je cherchais. Je n'étais pas sûr d'utiliser correctement les commandes find et sed et vous m'avez aidé à voir où je devais faire les changements nécessaires. Dans ma lecture, j'ai vu que je pourrais utiliser d'autres caractères (c'est-à-dire%) dans sed. L'exemple que j'ai vu a utilisé $ alors je l'ai essayé et ça a marché. Je vais essayer de modifier ma syntaxe sed en utilisant vos astuces et j'espère que cela fonctionnera. Merci encore. – mark

6

plus facile:

Allez dans le dossier où vous voulez avoir les fichiers et faire:

find /path/with/files -type f -name "*txt*" -exec ln -s {} . ';' 
Questions connexes