¿Cómo muevo miles de archivos de una lista? -- mmand-line campo con rsync campo con batch camp askubuntu Relacionados El problema

How do I move thousands of files from a list?


2
vote

problema

Español

Entonces, tengo una lista de archivos en un archivo de texto. Creo que es alrededor de 100,000 archivos.

Los archivos en dicha lista se distribuyen en muchos directorios, tienen diferentes tamaños, nombres de archivos, extensiones, edades, etc.

Estoy tratando de encontrar una manera de mover esos archivos, y solo aquellos, a otra unidad.

Factor de complicación: algunos de los archivos tienen el mismo nombre, pero no son el mismo archivo. No se pueden mover a una sola carpeta con una sobrescritura o ignorando la política hacia los múltiples.

Preferiblemente, me gustaría que conserven su estructura de directorios, pero solo tienen los archivos que quiero dentro del directorio de destino. (La unidad de destino no es lo suficientemente grande como para simplemente copiar todo).

A continuación se muestra un ejemplo de algunas líneas en el archivo de texto que tiene los nombres de los archivos de origen:

  media/dave/xdd/cruzer/F#(NTFS 1)/Raw Files/Portable Network Graphic file/3601-3900/FILE3776.PNG/Windows/winsxs/amd64_microsoft-windows-o..disc-style-memories_31bf3856ad364e35_6.1.7600.16385_none_51190840a935f980/Title_mainImage-mask.png media/dave/xdd/d1/other/hd1/Program Files/DVD Maker/Shared/DvdStyles/Memories/Title_content-background.png   

He intentado usar

  ABCDEFGHIJKLMNABCDEFGHIJKLMN8   

que se queja de que hay demasiados argumentos.

también

  ABCDEFGHIJKLMNABCDEFGHIJKLMN9   

y

  /etc/cron.weekly/fstrim: /etc/cron.weekly/fstrim: 10: exec: fstrim-all: not found run-parts: /etc/cron.weekly/fstrim exited with return code 127 0  

Sin embargo, esto solo intenta copiar mi directorio raíz al destino.


¿Cómo puedo copiar los archivos específicos que quiero?

Original en ingles

So, I have a list of files in a text file. I believe it's about 100,000 files.

The files in said list are spread across many directories, have different sizes, filenames, extensions, ages, etc.

I am trying to find a way to move those files, and just those, to another drive.

Complicating factor: some of the files have the same name, but are not the same file. They can't just be moved into one folder with an overwriting or ignoring policy towards multiples.

Preferably, I would like them to retain their directory structure, but only have the files that I want inside the destination directory. (the destination drive isn't big enough to simply copy everything).

Below is an example of some lines in the text file that has the names of the source files:

media/dave/xdd/cruzer/F#(NTFS 1)/Raw Files/Portable Network Graphic file/3601-3900/FILE3776.PNG/Windows/winsxs/amd64_microsoft-windows-o..disc-style-memories_31bf3856ad364e35_6.1.7600.16385_none_51190840a935f980/Title_mainImage-mask.png media/dave/xdd/d1/other/hd1/Program Files/DVD Maker/Shared/DvdStyles/Memories/Title_content-background.png 

I have tried to use

rsync -av `cat /sourcefile.txt` /media/destinationhdd 

which complains that there are too many arguments.

Also

rsync -a --files-from=/sourcefile.txt / /media/destinationhdd 

and

cat /sourcefile.txt | xargs -n 200 rsync -av % /media/destinationhdd 

However, this just tries to copy my root directory to the destination.


How do I just copy the specific files that I want to?

        
     
     

Lista de respuestas

3
 
vote
vote
La mejor respuesta
 

Aquí hay un pequeño script Shell para usted:

  #!/bin/sh  while read line do     DIR=`dirname "$line"`     mkdir -p "$2/$DIR"     mv "$line" "$2/$DIR" done < $1   

Uso (asumiendo que guardó el script como script.sh e hice ejecutable con chmod +x script.sh ):

  ./script.sh input.txt output_directory   

Moverá todos los archivos enumerados en input.txt a output_directory , utilizando sus rutas originales, por ejemplo, para un abcdefghijklmnabcdefghhijklmn7 tiene la siguiente lista :

  ABCDEFGHIJKLMNABCDEFGHIJKLMN8   

Los archivos se moverán a:

  ABCDEFGHIJKLMNABCDEFGHIJKLMN9   

Lo hice Algunas pruebas de antes de publicar esta respuesta, pero por favor, asegúrese de probarlo en una muestra más pequeña primero para confirmar que está funcionando como se espera.

 

Here is a little shell script for you:

#!/bin/sh  while read line do     DIR=`dirname "$line"`     mkdir -p "$2/$DIR"     mv "$line" "$2/$DIR" done < $1 

Usage (assuming you saved the script as script.sh and made it executable with chmod +x script.sh):

./script.sh input.txt output_directory 

It will move all files listed in input.txt to output_directory, using their original paths, for example, for an input.txt has the following list:

test.txt dir1/test.txt Another Test/something_else.txt 

The files will be moved to:

output_directory/test.txt output_directory/dir1/test.txt output_directory/Another Test/something_else.txt 

I did some testing before posting this answer, but please make sure you try it on a smaller sample first to confirm it's working as expected!

 
 
     
     
1
 
vote

El siguiente script copia primero el directorio estructura de la fuente, luego los archivos de su lista a las carpetas correspondientes. La línea ABCDEFGHIJKLMNABCDEFGHIJKLMN10 es para evitar errores en caso de que el filmarista contenga líneas vacías.

  #!/bin/sh  while read line do     DIR=`dirname "$line"`     mkdir -p "$2/$DIR"     mv "$line" "$2/$DIR" done < $1 1  

Cómo usar

  • Copie el script en un archivo vacío, guárdelo como Move.py
  • Agregue las rutas apropiadas en la sección de la cabeza
  • ejecutarlo por:

      #!/bin/sh  while read line do     DIR=`dirname "$line"`     mkdir -p "$2/$DIR"     mv "$line" "$2/$DIR" done < $1 2  
 

The following script first copies the directory structure from the source, then the files from your list into the corresponding folders. The line if not line in ["", "\n"] is to prevent errors in case the filelist contains empty lines.

#!/usr/bin/env python  import os import shutil  source = "/path/to/source"; target = "/path/to/target"; filelist = "/path/to/filelist.txt"  for root, dirs, files in os.walk(source):     for dr in dirs:         dr = root+"/"+dr         destdir = dr.replace(source, target)         if not os.path.exists(destdir):             os.makedirs(destdir)  with open(filelist) as lines:     src = lines.readlines()  for line in src:     if not line in ["", "\n"]:         shutil.copyfile(line.replace("\n", ""),             line.replace("\n", "").replace(source, target)) 

How to use

  • Copy the script into an empty file, save it as move.py
  • Add the appropriate paths in the head section
  • Run it by:

    python /path/to/move.py 
 
 
0
 
vote

Puede hacerlo con Xargs bastante fácilmente.

  #!/bin/sh  while read line do     DIR=`dirname "$line"`     mkdir -p "$2/$DIR"     mv "$line" "$2/$DIR" done < $1 3  

El bit duro se asegura de que exista la nueva estructura de directorio. Para eso usamos #!/bin/sh while read line do DIR=`dirname "$line"` mkdir -p "$2/$DIR" mv "$line" "$2/$DIR" done < $1 4 para obtener los nombres de directorio, #!/bin/sh while read line do DIR=`dirname "$line"` mkdir -p "$2/$DIR" mv "$line" "$2/$DIR" done < $1 5 para construirlos y, finalmente, #!/bin/sh while read line do DIR=`dirname "$line"` mkdir -p "$2/$DIR" mv "$line" "$2/$DIR" done < $1 6 (o abcdefhijklmnabcdefhijklmn17 ) para copiar / mover de uno a otro. Lo he dejado en modo de copia para que pueda probar.

Sugeriría probar que #!/bin/sh while read line do DIR=`dirname "$line"` mkdir -p "$2/$DIR" mv "$line" "$2/$DIR" done < $1 8 y abcdefhijklmnabcdefghijklmn19 le dan el mismo número después.

 

You can do this with xargs fairly easily.

mkdir /newroot/ <filenames.txt xargs -I% bash -c 'mkdir -p /newroot/$(dirname "%" && cp "%" "/newroot/%"' 

The tough bit is making sure the new directory structure exists. For that we use dirname to get the directory names, mkdir -p to build them and finally cp (or mv) to copy/move from one to the other. I've left it in copy mode so you can test.

I would suggest testing that find /newroot/ -type f | wc -l and wc -l filenames.txt both give you the same number afterwards.

 
 

Relacionados problema

50  ¿Procesamiento por lotes TIF imágenes? Convertir .tif a .jpeg  ( Batch processing tif images converting tif to jpeg ) 
Estoy tratando de convertir en masa un puñado de archivos .tif . Pensé que Pensé podría parecer un buen candidato, pero estoy ejecutando Ubuntu 11.04. Parece...

666  ¿Cómo puedo eliminar recursivamente todos los archivos de una extensión específica en el directorio actual?  ( How can i recursively delete all files of a specific extension in the current di ) 
¿Cómo elimino de manera segura todos los archivos con una extensión específica (por ejemplo, .bak ) desde el directorio actual y de todas las subcarpetas usa...

1  Herramienta de GUI para fotos de marca de agua y otras imágenes  ( Gui tool for watermarking photos and other images ) 
Los padres me preguntaron si pueden ser marcados sus fotos. Por "Watermark" me refiero a una pequeña firma en una esquina. Hice una Phatch Escenario que c...

5  Cambie el nombre de los archivos numéricamente (orden de fecha / hora) [duplicar]  ( Rename files numerically date time order ) 
Esta pregunta ya tiene respuestas aquí : Cómo a granel Cambiar nombre Los archivos numéricamente, en...

2  Ejecutar un comando contra un lote completo de archivos  ( Run a command against an entire batch of files ) 
Quiero ejecutar una herramienta de línea de comandos que realice un archivo, lo manipula y exporta un nuevo archivo. Puedo usar este comando, simplemente para...

1  Archivos de APE (Audio de Monkey): ¿Cómo crearlos bajo confianza y xenial?  ( Ape files monkeys audio how to create them under trusty and xenial ) 
He visto una gran cantidad de información útil sobre Preguntar a Ubuntu sobre cómo jugar Los archivos de audio o APE de Monkey. Sin embargo, me gustaría cre...

22  Cómo convertir por lotes .doc o .docx a .pdf  ( How to batch convert doc or docx to pdf ) 
Necesito convertir por lotes con un conjunto de .doc o abcdefghijklmn.docx Archivos en abcdefhijklmnabcdefghijklmn5 en terminal, no con una GUI. Sería...

5  Cómo extraer las primeras 10 páginas de cada archivo PDF de una carpeta  ( How to extract first 10pages from each pdf files of a folder ) 
Tengo 90 subcarpetas en una carpeta. Cada subcarpeta contiene archivos PDF. Los archivos PDF total son casi 2200. ¿Cómo puedo extraer la página 3 a 10 de todo...

1  FFMPEG BATCH Convertir archivos  ( Ffmpeg batch convert files ) 
Tengo una carpeta que contiene archivos de audio, los archivos están en secuencia llamados de 1 a 150, pero ninguno de los archivos tiene extensión de archivo...

14  ¿Hay alguna manera de hacer un archivo que ejecute un comando de terminal cuando lo haga clic?  ( Is there a way to make a file that would run a terminal command when you click i ) 
¿Hay alguna manera de hacer un archivo que ejecute un comando de terminal cuando lo haga clic? Similar a una extensión .bat en Windows? ...




© 2022 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos