2 votos

Utilizar un documento de texto con espacios en blanco que contenga nombres de archivos para copiar por lotes entre directorios en el Terminal

Estoy usando la terminal en MacOS Ventura. Quiero tener un archivo de texto de archivos que copiaré usando la terminal. Esto no funciona cuando hay espacios en los nombres de los archivos.

A=~/Documents/test1
B=~/Documents/test2

while IFS= read -r file; do
cp "${A}/${file}" "${B}"
done < ~/Documents/testme.txt

Aquí está el archivo de texto de ejemplo.

# contents of ~/Documents/testme.txt
the first file.pdf
the second file.pdf
the third file.pdf

Después de ejecutar el código anterior obtengo:

cp: /Users/myusername/Documents/test1/the first file.pdf: No such file or directory
cp: /Users/myusername/Documents/test1/the second file.pdf: No such file or directory
cp: /Users/myusername/Documents/test1/the third file.pdf: No such file or directory

Supongo que esto se debe a los espacios en blanco en el nombre del archivo, pero supongamos que quiero utilizar un archivo de texto con archivos sin espacios en blanco separados sólo con un salto de línea.

¿Cómo se hace?

Incluso cuando intento escapar de las comillas de uso, se producen los siguientes errores.

while IFS= read -r file; do
cp "\"${A}/${file}"\" "\"${B}/${file}"\"
done < ~/Documents/testme.txt
cp: "/Users/myusername/Documents/test1/the first file.pdf": No such file or directory
cp: "/Users/myusername/Documents/test1/the second file.pdf": No such file or directory
cp: "/Users/myusername/Documents/test1/the third file.pdf": No such file or directory

Sin embargo, no hay problemas para copiar y pegar esa misma línea.

cp "/Users/myusername/Documents/test1/the first file.pdf" ./test2 ¡Funciona!

EDIT, versión zsh: zsh 5.8.1 (x86_64-apple-darwin22.0) .

-1voto

JL Peyret Puntos 133

Curiosamente sí funcionó cuando intenté replicarlo, incluso sin hacer mucho.

probar esto.sh

rm -rf test1 test2 testme.txt
unset A
unset B

mkdir test1
mkdir test2

echo "the first file.pdf" > testme.txt
echo "the second file.pdf" >> testme.txt
echo "the third file.pdf" >> testme.txt

echo file1 > "test1/the first file.pdf"
echo file2 > "test1/the second file.pdf"
echo file3 > "test1/the third file.pdf"

A=test1
B=test2

tree

while IFS= read -r file; do
    echo cp "${A}/${file}" "${B}" ...
    cp "${A}/${file}" "${B}"
done < testme.txt

después de source trythis.sh ...

% tree
.
 test1
    the\ first\ file.pdf
    the\ second\ file.pdf
    the\ third\ file.pdf
 test2
    the\ first\ file.pdf
    the\ second\ file.pdf
    the\ third\ file.pdf
 testme.txt
 trythis.sh

% cat test2/the\ third\ file.pdf 
file3

Nota: No estoy publicando esto para decir que el OP no sabe lo que está haciendo o no tiene un problema. Simplemente, ya que había hecho esto para comprobar de todos modos, para proporcionar una línea de base del comportamiento esperado. A veces es más fácil trabajar a partir de casos simples conocidos que funcionan para depurar algo que no funciona pero que es más complejo.

Si te apetece, vota en contra ;-) De todas formas no era el OP.


env: zsh 5.8 (x86_64-apple-darwin18.7.0) / BigSur 11.6.5

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