¿Usar el resultado de un comando como argumento en bash?
-
09-06-2019 - |
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!
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