mover archivo por lista en archivo (con espacios en blanco iniciales)

12

Tengo un archivo que contiene nombres de archivo. Por ejemplo:

/tmp/list.txt (es con los espacios al comienzo de cada línea):

  /tmp/file.log
  /app/nir/home.txt
  /etc/config.cust

Quiero, usando una línea, mover todos los archivos listados /tmp/list.txta/app/dest

Entonces debería ser algo como esto:

cat /tmp/list.txt | xargs mv /app/dest/
Nir
fuente

Respuestas:

21

Solo le falta la -topción para mv(suponiendo GNU mv):

cat /tmp/list.txt | xargs mv -t /app/dest/

o más corto (inspirado por la respuesta de X Tian):

xargs mv -t /app/dest/ < /tmp/list.txt

los espacios iniciales (y posibles finales) se eliminan. Los espacios dentro de los nombres de archivo darán lugar a problemas.

Si tiene espacios o pestañas o comillas o barras invertidas en los nombres de archivo, suponiendo que GNU xargspuede usar:

sed 's/^ *//' < /tmp/list.txt | xargs -d '\n' mv -t /app/dest/
Anthon
fuente
Gracias por la respuesta . con esto puedo hacer una lista de muchos archivos con [!] en su nombre, y moverme a otra carpeta, con lo siguiente: ls | grep -e ". [!]]" | tee 001.txt; sed 's / ^ * //' <001.txt | xargs -d '\ n' mv -t / destinypath /
inukaze
6

Asumiendo que sus nombres de archivo son relativamente sanos (no hay líneas nuevas o caracteres extraños):

while read file; do mv "$file" /app/dest/; done < list.txt 

Para tratar con nombres de archivo extraños (se rompe si un nombre de archivo tiene una nueva línea):

while IFS= read -r file; do mv "$file" /app/dest/; done < list.txt 
terdon
fuente
Hola terdon, ¿cómo mover carpetas al nuevo directorio en función de su coincidencia en el archivo csv? ¿Podrían ayudarme con esto [ unix.stackexchange.com/questions/433068/… ¡ Gracias!
user3351523
@ user3351523 su pregunta ha sido cerrada. Pedir ayuda a personas aleatorias no cambiará eso. En cambio, edite la pregunta y explique cómo las soluciones en el duplicado no lo ayudaron. Si algo "no funcionó", explique cómo falló. Las soluciones deberían funcionar para usted, por lo que debe explicar qué sucede cuando las prueba.
terdon
Yo lo hice. Puedes echar un vistazo.
user3351523
@ user3351523 no ha explicado por qué las soluciones del engaño fallan para usted. Y no ha explicado cómo fallan las respuestas que ha obtenido. Es posible que solo necesite usar, cp -Hrpero no sé si OSX lo cpadmite.
terdon
3
for i in $(cat /tmp/list.txt); do mv "$i" /app/dest/; done
mavillan
fuente
1

Lectura pura de xargs directamente del archivo

xargs -l -i < flist  mv -v {} /app/dst

editar 1 - después del comentario de @Anthon a continuación,

xargs -I{} < flist  mv -v {} /app/dst
X Tian
fuente
1
-ise deprecrated, y, o reemplazo -I implica -l/ --max-lines=1. Y hace mvque se ejecute para cada archivo por separado.
Anthon
0
mv `cat /tmp/list.txt` /app/dest/

(los espacios al inicio se ignoran)

Espen Mikal Robertsen
fuente