2008-09-12 10 views
44

Pour créer une liste de lecture pour toute la musique d'un dossier, j'utilise la commande suivante sous bash:Utiliser le résultat d'une commande comme argument dans bash?

ls > list.txt 

J'aimerais utiliser le résultat de la commande pwd (répertoire de travail d'impression) pour le nom de la playlist.

Quelque chose comme:

ls > ${pwd}.txt 

Cela ne fonctionne pas - quelqu'un peut-il me dire quelle syntaxe je dois utiliser pour faire quelque chose comme ça?

Edit: Comme mentionné dans les commentaires, pwd finira par donner un chemin absolu, donc ma playlist sera nommée .txt dans un répertoire - d'oh! Je vais donc devoir couper le chemin. Merci d'avoir remarqué cela - j'aurais probablement passé une éternité à me demander où sont passés mes fichiers!

Répondre

56

Utilisez backticks de substituer le résultat d'une commande:

ls > "`pwd`.txt" 

Comme indiqué par Landon, $(cmd) est équivalente:

ls > "$(pwd).txt" 

Notez que la substitution non transformé de pwd est un chemin absolu, la commande ci-dessus crée donc un fichier avec le même nom dans le même répertoire que le répertoire de travail, mais avec une extension .txt. Thomas Kammeyer a souligné que la commande basename bandes le répertoire principal, donc cela créerait un fichier texte dans le répertoire courant avec le nom de ce répertoire:

ls > "`basename "$(pwd)"`.txt" 

également grâce à erichui pour aborder le problème des espaces le chemin.

+0

Mais notez que l'utilisation des accents graves ou ($) sera toujours la fourche une autre coquille .. L'utilisation de la variable d'environnement est la méthode la moins coûteuse. –

+0

Vrai, mais le titre de la question et les tags sont généralisés, donc la réponse pourrait aussi bien être généralisée. Une variable d'environnement est l'option «meilleur» dans ce cas, mais ce n'est pas une réponse générale à la question. –

4

La syntaxe est:

ls > `pwd`.txt 

C'est le caractère '`' en dessous de la '~', pas la seule citation régulière.

6

Pour faire littéralement ce que vous avez dit, vous pouvez essayer:

ls > `pwd`.txt 

qui utilisera le chemin complet, qui devrait être bien. Notez que si vous faites cela dans votre répertoire personnel, qui pourrait être dans/home/hoboben, vous allez essayer de créer /home/hoboben.txt, un fichier texte dans le répertoire ci-dessus.

Est-ce ce que vous recherchiez?

Si vous souhaitez que le répertoire contienne un fichier portant son nom, vous obtiendrez le nom de base du répertoire en cours et l'ajouter avec .txt au fichier pwd.

Maintenant, plutôt que d'utiliser la commande pwd ... pourquoi ne pas utiliser la variable d'environnement PWD?

Par exemple:

ls > $PWD.txt 

ou

ls > ${PWD}.txt 

est probablement ce que vous essayez de se rappeler avec votre deuxième exemple.

Si vous êtes dans/home/hoboben et que vous voulez créer /home/hoboben/hoboben.txt, essayez:

ls > ${PWD}/${PWD##*/}.txt 

Si vous faites cela, le fichier contiendra son propre nom, afin le plus souvent, vous y remédieriez de plusieurs façons. Vous pouvez rediriger vers un autre emplacement et déplacer le fichier ou nommer le fichier en commençant par un point pour le masquer à partir de la commande ls tant que vous n'utilisez pas l'option -a (puis renommez éventuellement le fichier résultant). J'écris mes propres scripts pour gérer une hiérarchie de répertoires de fichiers musicaux et j'utilise des sous-répertoires nommés ".info", par exemple, pour contenir des données de piste dans certains fichiers de réserve (essentiellement, je "cache" les métadonnées de cette façon). Cela fonctionne bien parce que mes besoins sont simples et ma collection petite.

1

L'utilisation de la méthode ci-dessus créera les fichiers au-dessus de votre répertoire actuel. Si vous voulez que les listes de lecture à tous aller à un répertoire que vous aurez besoin de faire quelque chose comme:

#!/bin/sh 

MYVAR=`pwd | sed "s|/|_|g"` 
ls > /playlistdir/$MYVAR-list.txt 
5

Cela équivaut à la solution backtick:

ls > $(pwd).txt 
5

Je soupçonne que le problème peut être que il y a des espaces dans l'un des noms de répertoires. Par exemple, si votre répertoire de travail est "/ home/user/music/artist name". Bash sera confus en pensant que vous essayez de rediriger vers/home/user/music/artist et name.txt. Vous pouvez corriger cela avec des guillemets doubles

ls > "$(pwd).txt" 

En outre, vous voudrez peut-être pas rediriger vers txt $ (pwd). Dans l'exemple ci-dessus, vous seriez redirigeant la sortie vers le fichier «/home/user/musique/artiste nom.txt »

0

à dénuder tout sauf le nom du répertoire

ls >/playlistdir/${PWD##/*}.txt 

c'est probablement pas ce vous voulez parce que vous ne savez pas où les fichiers sont (sauf si vous modifiez la commande ls)

pour remplacer «/» avec « _ »

ls >/playlistdir/${PWD//\//_}.txt 

mais la liste de lecture regarderait laid et mayb e ne forme même dans la fenêtre de sélection

Alors cela vous donnera à la fois un nom court lisible et des chemins utilisables dans le fichier

ext=.mp3 #leave blank for all files 
for FILE in "$PWD/*$ext"; do echo "$FILE";done >/playlistdir/${PWD##/*}.txt