Je voudrais ouvrir tous les fichiers texte qui sont le résultat d'une commande ls à l'aide d'un éditeur de texte. Comment puis-je faire cela?
la source
Je voudrais ouvrir tous les fichiers texte qui sont le résultat d'une commande ls à l'aide d'un éditeur de texte. Comment puis-je faire cela?
Gilles a tout à fait raison , ls
est un très mauvais exemple car l'expansion de glob de nom de fichier peut être faite beaucoup plus facilement sur la ligne de commande sans avoir à utiliser ls
du tout! Si vos soi-disant «fichiers texte» ont des extensions de nom de fichier pour les identifier, vous pouvez faire quelque chose comme ceci:
editor-command *.txt
Pour démontrer une technique, utilisons un exemple plus compliqué qui ne pourrait pas être fait avec juste une correspondance de nom de fichier et ouvrez des fichiers basés sur le contenu au lieu de simplement le nom de fichier. Disons que vous vouliez ouvrir tous les fichiers qui contenaient la chaîne "content-type".
En supposant que votre éditeur accepte plusieurs noms de fichiers et les ouvre tous à la fois dans des tampons séparés ou fonctionne séquentiellement, vous pouvez simplement exécuter:
editor-command $(grep -i content-type)
Revenons maintenant à votre question d'origine, disons que vous ne savez pas s'il s'agit de fichiers texte ou non basés sur leurs noms. Vous devrez ensuite utiliser un autre programme pour les identifier, puis les ouvrir en fonction de ces données. Le programme file
vous indiquera de quel type de fichier il s'agit, et vous pouvez grep cette liste pour les fichiers texte uniquement, puis ouvrir uniquement les noms de fichiers correspondants comme ceci:
editor-command $(file -ni * | grep 'text/plain' | cut -d: -f1)
La sortie de la chaîne de commandes à l'intérieur de la $()
construction sera utilisée comme arguments pour l'éditeur. Je le fais parfois en deux étapes. Disons que je regarde un ensemble de fichiers et que j'obtiens une liste de chaque fichier xml contenant la chaîne "content-type"
find -type f -iname '*xml' | xargs grep -Hi 'content-type' | cut -d: -f1
... et décide que je veux les ouvrir. J'utilise ensuite le dernier raccourci de l'historique des commandes et je fais ceci:
vim $(!!)
... pour ouvrir tous les résultats de la commande précédente dans vim, mon éditeur préféré.
Si votre éditeur n'accepte qu'un seul fichier à la fois et que vous devez continuer à générer des éditeurs, vous devrez utiliser une variante de la boucle xargs
ou for
dans la réponse de jmtd selon que vous utilisez un éditeur basé sur un terminal qui a besoin de stdio.
editor-command *.css
, etc.Pour ouvrir tous les fichiers appelés quelque chose
.txt
(ie*.txt
) dans le répertoire courant:où
$EDITOR
est votre éditeur préféré, par exemplegedit *.txt
,nano *.txt
,vim *.txt
,emacs *.txt
ou autre chose. Utilisez juste*
pour faire correspondre tous les fichiers du répertoire actuel.Notez que la
ls
commande n'est pas impliquée. Le travail dels
n'est pas vraiment d'afficher une liste de fichiers, bien que cela se produise lorsque vous l'invoquez dans un répertoire. Ills
est utile d'afficher les attributs de fichier (heure de modification, autorisations, taille, etc.). Pour simplement faire quelque chose sur un tas de fichiers correspondant à un certain motif générique, les globes du shell sont suffisants.Des éditeurs suffisamment avancés vous permettent de le faire de l'intérieur. Par exemple, dans Emacs, utilisez simplement la commande normale d'ouverture de fichier (
C-x C-f
) et entrez*.txt
.Si vous souhaitez également faire correspondre des fichiers dans des sous-répertoires, en zsh ou bash ≥4, vous pouvez utiliser
$EDITOR **/*.txt
.la source
Cela dépend de certaines nuances de votre éditeur de texte. Les éditeurs avancés peuvent probablement gérer l'ouverture de plusieurs fichiers à partir de la ligne de commande en une seule instance. Mais disons, par exemple, que votre éditeur ($ EDITOR dans mes exemples ci-dessous) ne peut en ouvrir qu'un à la fois. Vous devez diriger la sortie d'un fichier approprié
find
versxargs
. Cela dépend également du fait que $ EDITOR ne prend pas en charge le téléscripteur (donc, en utilisant un graphique)Si vous souhaitez utiliser un éditeur de console, une boucle de shell peut être plus appropriée, mais elle échouera pour de nombreux noms de fichiers inhabituels (en réduisant ou en remplaçant les espaces blancs et diverses autres choses):
la source
$EDITOR *.c
oufor i in *.c; do $EDITOR "$i"; done
.for
casse échouera pour de nombreux noms de fichiers, y compris la réduction / la modification des caractères d'espacement.for
cas fonctionnera avec chaque nom de fichier (sauf éventuellement les noms commençant par-
ou+
avec certains éditeurs;for i in ./*.c
corrigerait cela).