web-dev-qa-db-fra.com

comment afficher les noms de fichiers entourés de guillemets dans la ligne SINGLE?

Je voudrais sortir la liste des éléments dans un dossier de la manière suivante:

"filename1"  "filename2" "file name with spaces" "foldername" "folder name with spaces"

En d'autres termes, les noms des éléments doivent figurer sur une seule ligne, entourés de guillemets (simples ou doubles) et divisés par des espaces.

Je le sais

find . | xargs echo

imprime la sortie sur une seule ligne, mais je ne sais pas comment ajouter des guillemets autour du nom de chaque élément.

Ce code fait partie d'un script bsh. La solution peut donc consister en un ensemble de commandes et utiliser des fichiers temporaires pour stocker une sortie intermédiaire.

Merci beaucoup pour toute suggestion.

A bientôt, Ana

22
Ana

cela devrait marcher

find $PWD | sed 's/^/"/g' | sed 's/$/"/g' | tr '\n' ' '

MODIFIER:

Cela devrait être plus efficace que le précédent.

find $PWD | sed -e 's/^/"/g' -e 's/$/"/g' | tr '\n' ' '

La solution de @ Timofey fonctionnerait finalement avec un tr et devrait être la plus efficace.

find $PWD -exec echo -n '"{}" ' \; | tr '\n' ' '
21
freethinker

Vous pouvez aussi simplement utiliser find "-printf", comme dans:

find . -printf "\"%p\" " | xargs your_command

où:

          %p     File's name.

Cela entourera tous les fichiers trouvés avec des guillemets et séparera chaque élément par un espace. Ceci évite l'utilisation de plusieurs commandes.

33
Benjamin A.

Essaye ça.

find . -exec echo -n '"{}" ' \;
14
Timofey Stolbov

Vous pouvez utiliser l'option GNU ls--quoting-style pour obtenir facilement ce que vous recherchez. De la page de manuel:

--quoting-style=Word

utilisez le style de citation Word pour les noms d'entrée: literal, locale, Shell, Shell-always, Shell-escape, Shell-escape-always, c, escape

Par exemple, en utilisant la commande ls --quoting-style=Shell-escape-always, votre sortie devient:

'filename1' 'filename2' 'file name with spaces' 'foldername' 'folder name with spaces'

En utilisant --quoting-style=c, vous pouvez reproduire exactement votre exemple souhaité. Toutefois, si la sortie doit être utilisée par un script Shell, vous devez utiliser l'un des formulaires qui échappe correctement aux caractères spéciaux, tels que Shell-escape-always.

11
George Hilliard

EDIT:
La réponse suivante génère une LIST séparée par une nouvelle ligne au lieu d’une seule ligne.

  1. En second lieu, je suppose que l'OP utilise le résultat pour appeler une autre commande.
  2. la conversion de la liste de sortie en une seule ligne est facile (| tr '\n' ' ')

Une méthode moins mentionnée consiste à utiliser l'option -d (--delimiter) de xargs:

find . | xargs -I@ -d"\n" echo \"@\" 

-I@ capture chaque résultat find sous la forme @, puis nous l'avons renvoyé avec des guillemets

Avec cela, vous pouvez appeler n'importe quelle commande tout en ajoutant des guillemets aux arguments.

$ find . | xargs -d"\n" testcli.js
[ "filename1",
  "filename2",
  "file name with spaces",
  "foldername",
  "folder name with spaces" ]

Voir https://stackoverflow.com/a/33528111/665507

2
leesei
for f in *; do printf "'%s' " "$f"; done; echo

Ou, grâce à Gordon Davisson :

printf "'%s' " *; echo

La echo de fin consiste simplement à ajouter une nouvelle ligne à la sortie.

2
glenn jackman
    find . | sed "s|.*|\"&\"|"

Brève description:
Nous prenons le résultat du modèle. * Et le mettons entre guillemets.
La bonne source est sed .

Description détaillée:
Modèle: s/one/ONE/

  • s Commande de substitution.
  • /Délimiteur.
    Dans mon expression "|" est utilisé à la place de "/" pour empêcher les "montagnes" comme dans le motif s /.*/\"&\"/.
  • one Modèle de recherche de modèle d'expression régulière.
  • ONEChaîne de remplacement.
  • . * signifie tout symbole qui se répète un nombre illimité de fois.
  • \"signifie" lui-même.
  • & Caractère spécial correspondant au motif trouvé.
0
iosuser2332

essayer

ls | sed -e 's/^/"/g' -e 's/$/"/g' | tr '\n' ' '
0
Ferroao