J'essaie d'obtenir mon script pour ls tous les fichiers de la formulaire "$ variable". *
Le paramètre est toujours un fichier avec l'extension .001 Je veux trouver tous les fichiers avec le même nom, mais une extension différente, par exemple $ file.002, fichier.003, etc. EG.:
file\[success\].mpg*
4 Réponses :
Utiliser Rechercher à la place LS:
$ ls weg.* ls: weg.*: No such file or directory $ find . -name weg.\* $
trouver . -Name Fichier [Succès] .mpg * ne trouve rien.
de la réponse de L0B0, je suppose que je devrais simplement utiliser une manière différente de LS
Vous pouvez utiliser Modifier concernant un commentaire em>: BASH code> 'S PrintF code> pour reformater la chaîne. En outre, vous n'avez pas besoin de citer * code>: printf% q code> reformate la chaîne dans un format pouvant être utilisé comme coquille Entrée (en ce qui concerne BASH code> S Man Man). P>
La solution ci-dessus ne fonctionne pas avec des espaces blancs dans les noms de fichiers. Pour ces cas (comme certaines autres réponses déjà mentionnées), il est préférable de ne pas utiliser printf code> mais pour indiquer correctement toutes les variables: p>
Je suis content que je puisse vous aider.
Cela fonctionne pour les fichiers avec des supports dans les noms, mais pas pour d'autres personnages impairs tels que des espaces. Par exemple, j'ai essayé ./ Findfiles1 "Test [SUCCESS] .mpg.001" CODE>, et il a analysé que deux noms de fichiers et ne trouvaient pas non plus: LS: \ [Succès \] .mpg *: Aucun fichier ou répertoire de ce type code> ls: test \: aucun fichier ou répertoire de ce type code>.
@Gordon: Vous avez raison. Cela ne fonctionne pas avec des espaces / des onglets. Pour ces cas, il vaut mieux aller avec la solution mentionnée par Philipp ou Kaleb pour faire quelque chose comme ls - "$ {premier% .001}" * code>. Je vais ajouter ceci à ma réponse.
Vous n'êtes pas trop loin. Mon premier correctif consiste à changer la ligne 3 ci-dessous: ceci va développer mais, lorsque aucun fichier n'est présent, la coque passe le GLOB à LS et il verra astérisque: < / p> Ainsi, votre ligne, Sauf si vous avoir un nom de fichier Une autre option consiste à utiliser Basename: P> à l'aide de Cependant, comme d'autres ont souligné, en fonction de quoi Vous faites avec la liste des fichiers, EDIT: Le double trait d'union ne fonctionne pas sur toutes les variantes * Nix mais indique au $ d'autres code> et permettre à la globe globale se produira. Il est la responsabilité de développer le * code> à la liste de tous les noms de fichiers correspondants. La liste des noms de fichiers est ensuite envoyée à ls code>. On dirait que dans la plupart des cas, LS verra quelque chose comme ceci: p> ls $ autres "*" code> ajoute un astérisque littéral qui va voir. p> fichier1. * code> (avec un astérisque littéral), ls code> échouera. p> basename code> vous donne l'avantage de supprimer les répertoires, etc. p> trouver code> peut être meilleur. p> LS code> et BasEname code> Commandes qu'aucun autre argument CLI ne suive. Cotant Vos variables peuvent être des pratiques optimales, mais je préfère la simplicité de les laisser éteindre à moins que les données ne soient pas de confiance. Connaître vos données et devis de manière appropriée. P> p>
Vos variables ne sont pas correctement citées, ce qui provoque des problèmes si les noms de fichiers contiennent des espaces ou d'autres caractères «spéciaux». Utilisez ls - "$ d'autres" * code> et basename - "$ premier" code> à la place.
Vous devez citer la variable, pas le caractère générique: Le double tirette arrête de rechercher des options afin que ce code fonctionne même si Notez que Si vous souhaitez imprimer uniquement les noms, vous n'avez pas besoin d'autres code> commence par un Dash. P> ls code> est le plus souvent que pas la mauvaise solution dans les scripts. Utilisez-le uniquement si vous souhaitez vraiment imprimer la liste, par exemple. au format long: p> ls code> du tout: p> for filename in "$others"*