Question

Pour créer une playlist pour toute la musique d'un dossier, j'utilise la commande suivante dans bash :

ls > list.txt

Je voudrais utiliser le résultat du mot de passe (imprimer le répertoire de travail) pour le nom de la liste de lecture.

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 ?

Modifier: Comme mentionné dans les commentaires, pwd finira par donner un chemin absolu, donc ma playlist finira par être nommée .txt dans un répertoire - d'oh !Je vais donc devoir couper le chemin.Merci d'avoir repéré cela. J'aurais probablement passé des heures à me demander où étaient passés mes fichiers !

Était-ce utile?

La solution

La meilleure façon de procéder est de "$(command substitution)" (merci, Se poser sur):

ls > "$(pwd).txt"

Vous verrez parfois aussi des gens utiliser l'ancienne notation backtick, mais cela a plusieurs inconvénients en termes de nidification et d'évasion :

ls > "`pwd`.txt"

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

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

Merci également à Erichui d'avoir évoqué le problème des espaces dans le chemin.

Autres conseils

Ceci est équivalent à la solution backtick :

ls > $(pwd).txt

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

ls > `pwd`.txt

qui utilisera le chemin d’accès complet, ce qui devrait convenir.Notez que si vous faites cela dans votre répertoire domestique, qui pourrait être dans / home / hoboben, vous essairez le Créer /home/hoboben.txt, un fichier texte dans le répertoire ci-dessus.

C'est ce que tu voulais?

Si vous vouliez que le répertoire contienne un fichier nommé d'après, vous obtiendrez le nom de base du répertoire actuel et ajoute cela avec .txt au 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

c'est probablement ce dont vous essayiez de vous souvenir avec votre deuxième exemple.

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

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

Si vous faites cela, le fichier contiendra son propre nom, donc le plus souvent, vous y remédierez de plusieurs manières.Vous pouvez rediriger vers un autre endroit et déplacer le fichier ou nommer le fichier en commençant par un point pour le masquer de la commande ls tant que vous n'utilisez pas l'indicateur -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 les données des pistes dans certains fichiers de rechange (en gros, je "cache" les métadonnées de cette façon).Cela fonctionne bien car mes besoins sont simples et ma collection petite.

Je soupçonne que le problème vient peut-être du fait qu'il y a des espaces dans l'un des noms de répertoire.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 résoudre ce problème avec des guillemets doubles

ls > "$(pwd).txt"

De plus, vous ne souhaiterez peut-être pas rediriger vers $(pwd).txt.Dans l'exemple ci-dessus, vous redirigeriez la sortie vers le fichier "/home/user/music/artist name.txt".

La syntaxe est :

ls > `pwd`.txt

Il s'agit du caractère « » situé sous le « ~ », et non du guillemet simple habituel.

L'utilisation de la méthode ci-dessus créera les fichiers un niveau au-dessus de votre répertoire actuel.Si vous souhaitez que les listes de lecture soient toutes placées dans un seul répertoire, vous devez faire quelque chose comme :

#!/bin/sh

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

pour supprimer tout sauf le nom du répertoire

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

ce n'est probablement pas ce que vous voulez car vous ne savez pas où se trouvent les fichiers (sauf si vous modifiez la commande ls)

remplacer "/" par "_"

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

mais alors la liste de lecture aurait l'air moche et ne rentrerait peut-être même pas dans la fenêtre de sélection

Cela vous donnera donc à la fois un nom court et lisible et des chemins utilisables à l'intérieur du fichier.

ext=.mp3 #leave blank for all files
for FILE in "$PWD/*$ext"; do echo "$FILE";done >/playlistdir/${PWD##/*}.txt
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top