7
votes

BASH Script avec LS $ Variable

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*


0 commentaires

4 Réponses :


1
votes

Utiliser Rechercher à la place LS:

$ ls weg.*
ls: weg.*: No such file or directory
$ find . -name weg.\*
$


2 commentaires

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



9
votes

Vous pouvez utiliser BASH 'S PrintF pour reformater la chaîne. En outre, vous n'avez pas besoin de citer * : xxx

printf% q reformate la chaîne dans un format pouvant être utilisé comme coquille Entrée (en ce qui concerne BASH S Man Man).

Modifier concernant un commentaire :
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 mais pour indiquer correctement toutes les variables: xxx


3 commentaires

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" , 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 ls: test \: aucun fichier ou répertoire de ce type .


@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}" * . Je vais ajouter ceci à ma réponse.



3
votes

Vous n'êtes pas trop loin. Mon premier correctif consiste à changer la ligne 3 ci-dessous: xxx

ceci va développer $ d'autres et permettre à la globe globale se produira. Il est la responsabilité de développer le * à la liste de tous les noms de fichiers correspondants. La liste des noms de fichiers est ensuite envoyée à ls . On dirait que dans la plupart des cas, LS verra quelque chose comme ceci: xxx

mais, lorsque aucun fichier n'est présent, la coque passe le GLOB à LS et il verra astérisque: < / p> xxx

Ainsi, votre ligne, ls $ autres "*" ajoute un astérisque littéral qui va voir.

Sauf si vous avoir un nom de fichier fichier1. * (avec un astérisque littéral), ls échouera.

Une autre option consiste à utiliser Basename: xxx

à l'aide de basename vous donne l'avantage de supprimer les répertoires, etc.

Cependant, comme d'autres ont souligné, en fonction de quoi Vous faites avec la liste des fichiers, trouver peut être meilleur.

EDIT: Le double trait d'union ne fonctionne pas sur toutes les variantes * Nix mais indique au LS et BasEname 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.


1 commentaires

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" * et basename - "$ premier" à la place.



5
votes

Vous devez citer la variable, pas le caractère générique: xxx pré>

Le double tirette arrête de rechercher des options afin que ce code fonctionne même si d'autres code> commence par un Dash. P>

Notez que 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> xxx pré>

Si vous souhaitez imprimer uniquement les noms, vous n'avez pas besoin ls code> du tout: p>

for filename in "$others"*


0 commentaires