Pregunta

Para crear una lista de reproducción para toda la música en una carpeta, estoy usando el siguiente comando en bash:

ls > list.txt

Me gustaría utilizar el resultado de la persona con discapacidad Comando (imprimir directorio de trabajo) para el nombre de la lista de reproducción.

Algo como:

ls > ${pwd}.txt

Sin embargo, eso no funciona. ¿Alguien puede decirme qué sintaxis necesito usar para hacer algo como esto?

Editar: Como se menciona en los comentarios, pwd terminará dando una ruta absoluta, por lo que mi lista de reproducción terminará con el nombre .txt en algún directorio, ¡oh!Entonces tendré que recortar el camino.Gracias por detectar eso. ¡Probablemente habría pasado años preguntándome dónde estaban mis archivos!

¿Fue útil?

Solución

La mejor manera de hacer esto es con "$(command substitution)" (gracias, Aterrizar):

ls > "$(pwd).txt"

A veces también verás que la gente usa la notación de comillas invertidas más antigua, pero esto tiene varios inconvenientes en términos de anidar y escapar:

ls > "`pwd`.txt"

Tenga en cuenta que la sustitución sin procesar de pwd es una ruta absoluta, por lo que el comando anterior crea un archivo con el mismo nombre en el mismo directorio que el directorio de trabajo, pero con una .txt extensión.Thomas Kammeyer señaló que el basename El comando elimina el directorio principal, por lo que esto crearía un archivo de texto en el directorio actual con el nombre de ese directorio:

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

También gracias a erichui por plantear el problema de los espacios en el camino.

Otros consejos

Esto es equivalente a la solución de acento grave:

ls > $(pwd).txt

Para hacer literalmente lo que dijiste, puedes intentar:

ls > `pwd`.txt

que utilizará el nombre de ruta completo, lo cual debería estar bien.Tenga en cuenta que si hace esto en su directorio de inicio, que podría estar en /home /hoboben, probará create /home/hoboben.txt, un archivo de texto en el directorio anterior.

¿Es esto lo que querías?

Si desea que el directorio contenga un archivo que lleva su nombre, obtendría el nombre de base del directorio actual y lo agregaría con .txt al PWD.

Ahora, en lugar de usar el comando pwd...¿Por qué no utilizar la variable de entorno PWD?

Por ejemplo:

ls > $PWD.txt

o

ls > ${PWD}.txt

Probablemente es lo que intentabas recordar con tu segundo ejemplo.

Si estás en /home/hoboben y quieres crear /home/hoboben/hoboben.txt, prueba:

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

Si hace esto, el archivo contendrá su propio nombre, por lo que, en la mayoría de los casos, podrá solucionar este problema de varias maneras.Puede redirigir a otro lugar y mover el archivo o nombrarlo comenzando con un punto para ocultarlo del comando ls siempre y cuando no use el indicador -a (y luego, opcionalmente, cambiar el nombre del archivo resultante).

Escribo mis propios scripts para administrar una jerarquía de directorios de archivos de música y uso subdirectorios llamados ".info", por ejemplo, para contener datos de pistas en algunos archivos de repuesto (básicamente, "oculto" metadatos de esta manera).Funciona bien porque mis necesidades son simples y mi colección pequeña.

Sospecho que el problema puede ser que haya espacios en uno de los nombres de directorio.Por ejemplo, si su directorio de trabajo es "/home/user/music/artist name".Bash se confundirá al pensar que está intentando redirigir a /home/user/music/artist y name.txt.Puedes arreglar esto con comillas dobles.

ls > "$(pwd).txt"

Además, es posible que no desees redirigir a $(pwd).txt.En el ejemplo anterior, estaría redirigiendo la salida al archivo "/home/user/music/artist name.txt".

La sintaxis es:

ls > `pwd`.txt

Ese es el carácter '`' debajo de '~', no la comilla simple normal.

El uso del método anterior creará los archivos un nivel por encima de su directorio actual.Si desea que todas las listas de reproducción vayan a un directorio, deberá hacer algo como:

#!/bin/sh

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

para eliminar todo menos el nombre del directorio

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

Probablemente esto no sea lo que desea porque entonces no sabe dónde están los archivos (a menos que cambie el comando ls)

para reemplazar "/" con "_"

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

pero entonces la lista de reproducción se vería fea y tal vez ni siquiera cabría en la ventana de selección

Esto le dará un nombre breve y legible y rutas utilizables dentro del archivo.

ext=.mp3 #leave blank for all files
for FILE in "$PWD/*$ext"; do echo "$FILE";done >/playlistdir/${PWD##/*}.txt
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top