0 votos

¿Cómo citar una variable de ruta "$1" que contiene espacios?

Estoy llamando a un scriptdesde un scripty pasando un argumento posicional {carpeta} -cuyo valor es una ruta que contiene espacios por lo que necesita ser entrecomillado.

El segundo script es:

#!/bin/bash -xu
find "$1" -type f -iname "*.srt" | grep -v -e "\\.eng" -e "].srt" -e "].[0-9].srt" | while read -r file; do trash -F "$file";done;

No he conseguido añadir las comillas alrededor de la variable path $1 . (Supongo que este es el problema, me gustaría registrar toda la salida para localizarlo pero tampoco estoy seguro de cómo hacerlo)

Intenté escaparlo pero no funcionó \""$1"\"

El primer script:

#!/bin/bash
filebot -exec /Users/john/.filebot/scripts/delete_non-english_subtitles.sh {folder}

El segundo script:

find "$1" -type f -iname "*.srt" | grep -v -e "\\.eng" -e "].srt" -e "].[0-9].srt" | while read -r file; do trash -F "$file";done; \
echo "$1" >> ~/Desktop/SsubDeletetest.txt; \
echo "$1" | awk -F"/" '{ print $NF }' >> ~/Desktop/subtitletest.txt; \

He añadido las líneas de eco para tener una idea de cómo se formatea el valor del argumento. Esas dos líneas de eco están funcionando. Hay salida en esos archivos txt. Pero el comando Find nunca se ejecuta cuando es llamado. Puedo ejecutar los mismos comandos Find en la terminal cuando cito la ruta, pero el argumento aparentemente no se cita porque en el primer espacio en el valor de la ruta la ruta se recorta.

Debo añadir que el primer script está siendo llamado por una aplicación, no en Terminal. Así que la única manera de ver los resultados es la salida a un archivo de texto... creo.

  1. Su post-proceso script sólo borra los archivos *.srt, por lo que sería un caso de uso -exec bastante sencillo. Usted querrá refactorizar eso en su propio script y luego hacer que filebot lo llame mediante -exec en la carpeta de destino como se ha explicado anteriormente.

Este es el aspecto de la pila de llamadas:

1. qBT calls your qBT_e-program.sh
1.1. qBT_e-program.sh calls filebot
1.1.1. filebot -exec calls your delete-srt-files.sh passing along the destination {folder} as Argument $1
1.1.1.1. delete-srt-files.sh calls find "$1" ...```

Añadiendo más para ayudar a solucionar los problemas. Todavía atascado en esto. He aprendido a obtener algo de salida y tengo algunas pistas pero no puedo resolver el problema.

De nuevo, cuando añado la ruta en el script en cambio de usar la variable citada "$1", el script funciona. Cuando uso la variable falla y resulta en esta salida de error. Esto está siendo llamado desde el script inicial con el argumento citado "{carpeta}". He probado variaciones en el tratamiento de la variable: "{$1}" \""$1"\" "$1/" -$1 . Pensé que tal vez el comando filebot -exec ya estaba citando la variable y mis comillas en realidad la estaban descifrando.

+ read -r file
find: /Volumes/PlexMedia/PlexServer_1/Movies/Paper: No such file or directory
find: Lives: No such file or directory
find: (2021)/Paper: No such file or directory
find: Lives: No such file or directory
find: (2021): No such file or directory
find: {imdb-tt13045890}: No such file or directory
find: [[en]: No such file or directory
find: 2.40:1: No such file or directory
find: WS: No such file or directory
find: 1080p: No such file or directory
find: WEB-DL: No such file or directory
find: x265: No such file or directory
find: 584ECE9D].mp4: No such file or directory
echo result /Volumes/PlexMedia/PlexServer_1/Movies/Paper Lives (2021)/Paper Lives (2021) {imdb-tt13045890} [[en] 2.40:1 WS 1080p WEB-DL x265 584ECE9D].mp4

Veo que la variable se divide en los espacios. Pero está entrecomillada. Este es un archivo diferente pero el mismo script llamándolo desde el Terminal:

Sat Mar 13 12:12:30
iMac191:Klara (2010) john$ /Users/john/.filebot/scripts/delete_non-english_subtitles.sh
+ path='/Volumes/PlexMedia/PlexServer_1/Movies/Test Folder (1968)'
+ find '/Volumes/PlexMedia/PlexServer_1/Movies/Test Folder (1968)' -type f -iname '*.srt'
+ grep -v -e '\.eng' -e '].srt' -e ']\.[0-9].srt'
+ read -r file
+ trash -F '/Volumes/PlexMedia/PlexServer_1/Movies/Test Folder (1968)/moviename.swe.srt'
+ read -r file

0 votos

Por favor, añade detalles sobre cómo lo llamas y sobre el error que obtienes.

0 votos

@nohillside Modificado arriba en el post original.

1 votos

¿Qué es {carpeta}, no es sintaxis bash? También, use comillas simples a menos que quiera que el shell expanda el contenido de una cadena (no tendrá este el parámetro pasado después de -iname por ejemplo)

2voto

siva Puntos 23

Lo has hecho correctamente en tu ejemplo.
"$1" se sustituirá por "parameter content" , citado.

Puede comprobarlo minimizando aún más su código.

#!/bin/bash
find "$1"

Esto funciona perfectamente:

$ ./find1.sh "foo bar"
foo bar/.DS_Store
foo bar/test
foo bar/test.xcodeproj
foo bar/testUITests
foo bar/testTests

Esto demuestra que el parámetro del script se proporciona correctamente al comando find.

Tu problema debe estar en otra parte. ¡Asegúrate de que estás llamando al script con las citas correctas también!

Para ver cómo se reemplazan las variables con su contenido, añada set -x después del tinglado.

#!/bin/bash
set -x
find "$1"

Los comandos se ejecutan después de set -x se imprimirá con el prefijo + , mostrando la sustitución de variables:

$ ./find1.sh "foo bar"
+ find 'foo bar'
foo bar/.DS_Store
…

Basado en la llamada adicional script añadida, se puede ver que la presunción era correcta - el script no está siendo llamado citado.

#!/bin/bash
filebot -exec … {folder}

El {folder} no está entre comillas, por lo que cada argumento separado por espacios se da como un argumento independiente.

Es necesario citar "{folder}" así que es un argumento.

echo imprime todos los argumentos separados por espacios, por lo que no es adecuado para determinar errores de esta manera.

0 votos

He actualizado el post original con más detalles. Gracias.

0 votos

@John Gracias, esto demuestra la cuestión como yo presumía, ver edición

0 votos

Sigo teniendo problemas. Confiaba en que lo que habías escrito lo solucionaría, pero no ha sido así. Estoy atascado. He añadido más arriba si ayuda.

0voto

moodforaday Puntos 2633

Sería útil entender más específicamente lo que está tratando de lograr.

Sin embargo, tomando como punto de partida su puesto, yo empezaría por esto:

find "${1}" -type f -iname '*.srt' -print | while read line
do

    echo "$line"

done

y luego intente su grep comandos en el echo "$line"

También lo hay:

find "${1}" -type f -iname '*.srt' -print0 | xargs -0 foo

que se ejecutará foo en la salida de find .

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X