J'ai le malheur de venir d'un arrière-plan MS-DOS - mais au moins cela me fait apprécier à quel point Linux est beaucoup plus puissant. J'ai travaillé pour obtenir mon Linux-Fu à la hauteur, mais il y a quelques choses qui pourraient être faites avec DOS que je ne sais pas comment accomplir le plus facilement avec Linux:
Renommer plusieurs fichiers - à l'aide de deux caractères génériques
c:\> dir
Directory of c:\
file1.txt
file2.txt
file3.txt
file4.txt
c:\>rename *.txt *.bak
c:\> dir
Directory of c:\
file1.bak
file2.bak
file3.bak
file4.bak
Je sais que je pourrais utiliser find -exec
ici, mais est-il possible d'utiliser une syntaxe plus courte - peut-être mv
avec des drapeaux ou syntaxe spéciaux? Je suppose que la clé est le deuxième *
caractère générique car Linux ne devrait pas avoir de problème avec le premier (c'est-à-dire que je sais comment sélectionner les fichiers que je veux renommer en utilisant des caractères génériques)
Renommer un fichier unique - à l'aide d'un caractère générique
c:\> dir
Directory of c:\
file1.txt
c:\>rename file1.txt *.bak
c:\> dir
Directory of c:\
file1.bak
Cela serait particulièrement utile lors du renommage de noms de fichiers longs et lourds. J'ai pensé que je pourrais peut-être utiliser mv file1.txt $1.bak
pour finir avec file1.txt.bak
ce qui serait également acceptable, mais je ne suis pas sûr que vous puissiez référencer un $1
paramètre en ligne avec une commande shell. Encore une fois, dans ce cas particulier, il est juste pratique de savoir comment ms-dos bastardise le *
caractère générique à utiliser comme une sorte de correspondance capture / remplacement pour une partie du nom de fichier.
Filtrage des listes d'annuaire avec un caractère générique
c:\> dir
Directory of c:\
file1.txt
file2.txt
file3.txt
file4.txt
text.txt
\temp (directory)
c:\> dir file*
Directory of c:\
file1.txt
file2.txt
file3.txt
file4.txt
c:\> t*
Directory of c:\
text.txt
\temp (directory)
Je ne sais pas quelle est la bonne syntaxe pour le faire ls
, ou si c'est même possible. Si j'ai fait quelque chose comme ls t*
ça, il va récursivement dans les répertoires commençant par t
. Ma solution de contournement a été utilisée find . --max-depth 1 -iname "t*"
ou quelque chose du genre ls -al | grep t
- ni l'une ni l'autre n'est aussi courte et simple que cela dir t*
.
Enfin, je sais que je peux configurer des alias pour raccourcir ces longues commandes, mais j'aimerais apprendre quelques linux-fu prêts à l'emploi pour faire ces choses parce que parfois vous êtes connecté à un système distant ou que vous travaillez sur une nouvelle machine.
Alors, comment puis-je mv
et les ls
fichiers de la même manière que je le faisais dir
et les rename
fichiers?
somefunc *.Ext
ce modèle ne correspond à aucun fichier, et jouez avec des guillemets pour voir si vous parvenez à transmettre un modèle ( sans l'avoir développé) entre les fonctions. Conseil de sécurité: ne pas utiliserrm
n'importe où lors de l'expérimentation de l'expansion globulaire / shell :-)Une chose à garder à l'esprit en ce qui concerne les caractères génériques est qu'ils sont développés par le shell. L'application ne sait pas si vous avez utilisé des caractères génériques ou tapé les noms. Par exemple, si vous tapez
rename *.txt *.bak
, larename
commande voit quelque chose commerename file1.txt file2.txt existingfile.bak
. Ce n'est pas assez d'informations pour continuer.Je vais d'abord traiter de la question
ls
, car c'est plus simple. Si tout ce que vous voulez, ce sont les noms correspondants, alors vous n'en avez pas besoinls
, car le shell fait déjà l'expansion.Si vous voulez plus d'informations sur les fichiers, passez l'
-d
option àls
, pour lui dire de ne pas lister le contenu des répertoires.Il n'y a pas d'utilitaire standard pour renommer les fichiers, car les premiers systèmes Unix n'en étaient pas livrés. La méthode portable pour renommer des fichiers utilise une boucle et est un peu détaillée:
Il existe plusieurs utilitaires courants pour renommer des fichiers, dont aucun n'est garanti d'être installé sur un système Unix donné, mais tous sont faciles à installer. En voici les principaux:
rename
depuis lautil-linux
suite, disponible sur tous les systèmes Linux non intégrés (et nulle part ailleurs). Sur Debian et ses dérivés (y compris Ubuntu), cette commande est appeléerename.ul
. À condition qu'il n'y ait pas d'.txt
autre occurrence que l'extension finale, vous pouvez écrirerename
est un script Perl fourni par Debian et ses dérivés/usr/bin/rename
. Vous pouvez renommer des fichiers selon des commandes Perl arbitraires.mmv
, qui peut renommer, copier et lier des fichiers selon plusieurs modèles basés sur le nom et propose de nombreuses options concernant ce qui se passe si un nom cible existe déjà. Notez que vous devez utiliser des guillemets pour protéger les caractères génériques contre l'expansion par le shell.zmv
est une fonction zsh , disponible si et seulement si votre shell est zsh. Il peut correspondre à des modèles zsh arbitraires (vous pouvez donc faire correspondre les noms de fichiers en fonction d'expressions régulières arbitraires, pas seulement des caractères génériques, et vous pouvez faire correspondre les fichiers selon d'autres critères tels que les dates et les tailles).zmv
peut également copier et lier.Si vous avez un certain contrôle sur les machines que vous utilisez, ma recommandation est d'utiliser zsh comme shell (il a d'autres avantages par rapport à bash) et de mettre ces lignes dans votre
~/.zshrc
:noglob
est une fonctionnalité zsh qui indique au shell de ne pas développer les caractères génériques dans l'argument de la commande. De cette façon, vous pouvez écrirezmv *.txt \$1.txt
(vous aurez toujours besoin de protéger le$
dans un texte de remplacement).la source