2008-09-12 14 views
44

Para crear una lista de reproducción de toda la música en una carpeta, estoy usando el siguiente comando en bash:Usando el resultado de un comando como argumento en bash?

ls > list.txt 

me gustaría utilizar el resultado de la (imprimir directorio de trabajo) pwd de comandos para el nombre de la lista de reproducción.

Algo así como:

ls > ${pwd}.txt 

Eso no funciona aunque - ¿Puede alguien decirme lo que necesito sintaxis a utilizar para hacer algo como esto?

Editar: Como mencioné en los comentarios, pwd terminará dando un camino absoluto, por lo que mi lista de reproducción terminará siendo nombrada .txt en algún directorio - ¡oh! Así que tendré que recortar el camino. Gracias por detectar eso. ¡Probablemente hubiera pasado años preguntándome dónde iban mis archivos!

Respuesta

56

Use acentos abiertos para sustituir el resultado de un comando:

ls > "`pwd`.txt" 

Como se ha señalado por Landon, $(cmd) es equivalente:

ls > "$(pwd).txt" 

Tenga en cuenta que la sustitución no procesado 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 extensión .txt. Thomas Kammeyer señaló que el comando basename despoja al directorio líder, así que esto podría crear un archivo de texto en el directorio actual con el nombre de ese directorio:

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

También gracias a Erichui para criar el problema de los espacios de el camino.

+0

Pero tenga en cuenta que el uso de acentos abiertos o $() todavía se bifurcará otro proyectil .. .utilizar la variable de entorno es el método de menor costo. –

+0

Es cierto, pero el título y las etiquetas de la pregunta son generalizados, por lo que la respuesta también podría generalizarse. Una variable de entorno es la opción "mejor" en este caso, pero no es una respuesta general a la pregunta. –

4

La sintaxis es la siguiente:

ls > `pwd`.txt 

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

6

Para hacer literalmente lo que dijo, podría intentar:

ls > `pwd`.txt 

que utilizará la ruta completa, que debería estar bien. Tenga en cuenta que si hace esto en su directorio de inicio, que podría ser en/home/hoboben, intentará crear /home/hoboben.txt, un archivo de texto en el directorio anterior.

¿Esto es lo que quería?

Si desea que el directorio contenga un archivo que lleva su nombre, obtendrá el nombre base del directorio actual y lo agregará 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 

es probablemente lo que estaba tratando de recordar con su segundo ejemplo.

Si estás en/home/hoboben y desea crear /home/hoboben/hoboben.txt, intente:

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

Si lo hace, el archivo contendrá su propio nombre, por lo la mayoría de las veces, usted remediaría esto de una de las siguientes maneras. Puede redirigir a otro lugar y mover el archivo o nombrar el archivo que comienza con un punto para ocultarlo del comando ls, siempre que no use el indicador -a (y luego cambie el nombre del archivo resultante).

Escribo mis propios scripts para administrar una jerarquía de directorios de archivos de música y utilizo subdirectorios llamados ".info", por ejemplo, para contener datos de seguimiento 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.

1

El uso del método anterior creará los archivos un nivel por encima de su directorio actual. Si desea que las listas de reproducción a todos se van a un directorio que había necesidad de hacer algo como:

#!/bin/sh 

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

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

ls > $(pwd).txt 
5

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

ls > "$(pwd).txt" 

Además, puede que no quiera volver a dirigir a .txt $ (pwd). En el ejemplo anterior, se verá redirigiendo la salida al archivo "/ home/usuario/música/artista name.txt"

0

para despojar a todos, pero el nombre del directorio

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

esto probablemente no lo que se que quiera, porque entonces usted no sabe donde están los archivos (a menos que cambie el comando ls)

para sustituir "/" por "_"

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

pero entonces la lista de reproducción se vería feo y mayb e incluso no cabe en la ventana de selección

Así que esto le dará tanto un nombre legible corta y caminos utilizables dentro del archivo

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