Quelque chose que je me trouve faire souvent est d'exécuter une commande find et de les éditer tous dans vi, qui ressemble à ceci:
> find . "*.txt"
./file1.txt
./file2.txt
./path/to/file3.txt
> vi ./file1.txt ./file2.txt ./path/to/file3.txt
Existe-t-il un moyen intelligent et simple de tout faire en une seule ligne de commande?
xargs
détruire mon terminal shell. La solution appropriée est celle ci-dessous par @DevSolarRéponses:
Cela devrait faire l'affaire:
Utilisez Vim, c'est mieux pour votre santé. :-)
L'
+
option souvent ignorée pour faire-exec
apparaître tous les noms de fichiers (jusqu'à des limites de longueur de ligne) sur une seule ligne, c'est-à-dire que vous obtenez toujours tous les fichiers ouverts en une seulevim
session (parcourue avec:n
pour le:N
fichier suivant et le fichier précédent).Avec
vim -p
vous obtenez un onglet de fichier pour chaque fichier. Vérifiez:help tab-page-commands
pour plus de détails.Avec
vim -o
vous obtiendrez des fenêtres divisées horizontalement pour chaque fichier,vim -O
des fenêtres divisées verticalement. Vérifiez:help window-move-cursor
pour plus de détails.Notez que la version précédente de cette réponse
vim $(find . -name "*.txt")
,, ne fonctionne pas avec les espaces dans les noms de fichiers et a des implications de sécurité.La tuyauterie dans
xargs vi
donne unWarning: Input is not from a terminal
, plus un terminal avec un comportement complètement faux par la suite. L'utilisateur grawity a expliqué pourquoi dans un commentaire ci-dessous, et avec un peu plus d'explications dans cette question .la source
/dev/tty
et appeler ioctl () à ce sujet; c'est juste trop paresseux pour le faire.) Lorsqu'il est appelé par xargs, vim reçoit/dev/null
comme son entrée standard, qui ignore simplement les ioctls de contrôle de terminal.vim -p
si vous voulez des onglets de fichiers. (gt
etgT
pour naviguer, ou cliquez avec votre souris.)vim
, spécifiez simplement-
comme premier argument, comme dansecho foobar | vim -
.find . -name "*.txt" | vim -
vous donne une session vim sur un fichier sans nom contenant les noms des fichiers trouvés, ce qui n'est pas ce que l'OP a demandé ...Ou lancez vim et à partir de là:
la source
De plus, si vous souhaitez les ouvrir un à la fois, vous pouvez également utiliser find -exec ou utiliser une boucle for simple. Modifié par le commentaire de la ceving.
ou
la source
-name
est manquant. Et deuxièmement: la commande échoue lamentablement dès qu'un nom de fichier contient un espace. -1 pour une réponse mal avisée.Si vous avez déjà tapé votre
find
commande, je trouve qu'il peut être beaucoup plus facile d'utiliserxargs
pour ouvrir les résultats de la recherche:L'
-p
option indique à vim d'ouvrir chaque fichier dans un nouvel onglet. Je trouve cela plus pratique que d'utiliser simplement des tampons, mais si vous ne le faites pas, laissez cette option.la source
Pour modifier tout
*.txt
, il vous suffit de lancer:vim *.txt
. Pour modifier les fichiers renvoyés parfind
, lisez la suite.Sur Unix / macOS, vous pouvez utiliser
find
avec BSDxargs
(voir:)man xargs
, par exempleConnexes: Terminal borked après avoir appelé Vim avec xargs sur Vim.SE.
la source