scripts script programacion pasar parametros operaciones manejo español ejemplos comandos cadenas aritmeticas bash command-line

script - ¿Usar el resultado de un comando como argumento en bash?



scripts bash ejemplos (7)

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 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 usar el resultado del comando pwd (print working directory) 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 para hacer algo como esto?

Editar: Como mencioné en los comentarios, pwd terminará dando una ruta absoluta, por lo que mi lista de reproducción terminará siendo llamada .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!


Esto es equivalente a la solución retrospectiva:

ls > $(pwd).txt


La sintaxis es:

ls > `pwd`.txt

Ese es el caracter `` ''debajo del'' ~ '', no la comilla simple regular.


Para hacer literalmente lo que dijiste, podrías intentar:

ls > `pwd`.txt

que usará la ruta completa, que debería estar bien. Tenga en cuenta que si hace esto en su directorio de inicio, que podría estar en / home / hoboben, intentará crear /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 con 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 usar la variable de entorno PWD?

Por ejemplo:

ls > $PWD.txt

o

ls > ${PWD}.txt

es probablemente 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 la mayoría de las veces lo solucionará de varias 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 gestionar 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.


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á pensando 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 desee redireccionar a $ (pwd) .txt. En el ejemplo anterior, estarías redireccionando la salida al archivo "/ home / user / music / artist name.txt"


Usa los marcadores para sustituir el resultado de un comando:

ls > "`pwd`.txt"

Como señala Landon, $(cmd) es equivalente:

ls > "$(pwd).txt"

Tenga en cuenta que la sustitución no procesada 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 la extensión .txt . Thomas Kammeyer señaló que el comando basename elimina el directorio principal, por lo que 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 mencionar el problema de los espacios en el camino.


para quitar todo menos el nombre del directorio

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

esto probablemente no es lo que quieres porque entonces no sabes dónde están los archivos (a menos que cambies el comando ls)

para reemplazar "/" por "_"

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

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

Así que esto le dará a ambos un nombre breve 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