Cómo encontrar y copiar archivos a la carpeta en Bash Script -- bash campo con scripts camp askubuntu Relacionados El problema

How to find and copy files to folder in bash script


1
vote

problema

Español

en carpeta Tengo archivos de texto. Quiero encontrarlos y copiar para crear una carpeta. Todo funciona correctamente. El código crea una carpeta y copiar archivos, pero las pantallas de la consola:

  cp: './02_2017/lks07.txt' and '02_2017/lks07.txt' are the same file   

02_2017 se crea carpeta.

algo está mal en el código, pero no sé qué

Este es el código:

  date1=$(date '+%Y-%m-%d' -d "-0 month -$(($(date +%d)-1)) days") date2=$(date '+%Y-%m-%d' -d "-$(date +%d) days +1 month") date=$(date +'%m_%Y') mkdir -m 777 $date find ./ -type f -name '*.txt' -newermt $date1 ! -newermt $date2 -exec cp {} $date ;   

¿Puede alguien por favor ayudarme a poner esto?

Original en ingles

In folder I have text files. I want to find them and copy to created folder. Everything works correctly. The code creates a folder and copy files, but console displays:

cp: './02_2017/lks07.txt' and '02_2017/lks07.txt' are the same file 

02_2017 is created folder.

Something is wrong in code but I don't know what

This is the code:

date1=$(date '+%Y-%m-%d' -d "-0 month -$(($(date +%d)-1)) days") date2=$(date '+%Y-%m-%d' -d "-$(date +%d) days +1 month") date=$(date +'%m_%Y') mkdir -m 777 $date find ./ -type f -name '*.txt' -newermt $date1 ! -newermt $date2 -exec cp {} $date \; 

Can someone please help me whit this ?

     
 
 

Lista de respuestas

1
 
vote

Este problema se produce porque find buscará archivos secuencialmente. Por ejemplo, considere este diseño de directorio:

  $ tree . ├── 02_2017 │   └── foo.txt └── bar.txt   

Cuando ejecuta su ABCDEFGHIJKLMNABCDEFGHIJKLMN2 , primero encontrará cualquier archivo correspondiente en el directorio de nivel superior, por lo que encuentra bar.txt y lo mueve en . Luego, entrará en ABCDEFGHIJKLMNABCDEFGHIJKLMN5 y busque archivos allí. Ahora hay un archivo 02_2017/bar.txtdefghijklmn6 , por lo que trata de copiarlo a sí mismo, falla e imprime ese mensaje de error.

Este no es realmente un problema. Su guión está funcionando bien y está haciendo su trabajo correctamente. Puede ignorar el error de forma segura.

Si realmente lo molesta, puede arreglar agregando -maxdepth 1 a su comando find para que no descienda en subdirectorios:

  ABCDEFGHIJKLMNABCDEFGHIJKLMN9   

o, incluso mejor, al excluir el directorio de destino desde la ruta de búsqueda de Find:

  $ tree . ├── 02_2017 │   └── foo.txt └── bar.txt 0  
 

This problem occurs because find will look for files sequentially. For example, consider this directory layout:

$ tree . xe2x94x9cxe2x94x80xe2x94x80 02_2017 xe2x94x82xc2xa0xc2xa0 xe2x94x94xe2x94x80xe2x94x80 foo.txt xe2x94x94xe2x94x80xe2x94x80 bar.txt 

When you run your find command, it will first find any matching files in the top level directory, so it finds bar.txt and moves it into 02_2017. Then, it will go into 02_2017 and look for files there. There is now a 02_2017/bar.txt file, so it tries to copy it to itself, fails, and prints that error message.

This is not really a problem. Your script is working fine and is doing its job correctly. You can safely ignore the error.

If it really bothers you, you can fix by adding -maxdepth 1 to your find command so it doesn't descend into subdirectories:

find ./ -type f -name '*.txt' -newermt $date1 ! -newermt $date2 -exec cp {} $date \; 

Or, even better, by excluding the target directory from find's search path:

find ./ -type f -not -path './02_2017/*' -name '*.txt' -newermt $date1 ! -newermt $date2 -exec cp {} $date \; 
 
 
0
 
vote

Intenté realizar la misma tarea y recibí el mismo error hace algún tiempo. La idea era encontrar todos los archivos que se modificaron recientemente en un período y los respaldan por separado. Aunque vale la pena mencionar que, a pesar del error de CP, los archivos se estaban copiando. Aún no me gustó tener un error en el script, así que me ajusté así:

  $ tree . ├── 02_2017 │   └── foo.txt └── bar.txt 1  

Esto encontrará todos los archivos modificados los últimos 15 días y crearán una lista de ellos en un archivo de texto. El operador de $$ es el ID de proceso del script que se ejecuta. Esto asegura que si tengo procesos superpuestos, no usarán el mismo archivo, lo hace único en la ID del proceso.

  $ tree . ├── 02_2017 │   └── foo.txt └── bar.txt 2  

El segundo paso es usar RSYNC en lugar de CP. Puede definir una lista de texto con $ tree . ├── 02_2017 │   └── foo.txt └── bar.txt 3 cambia, y también comparará archivos y solo copiará lo que se ha modificado de los archivos en mi ubicación de respaldo. Mientras que $ tree . ├── 02_2017 │   └── foo.txt └── bar.txt 4 copiaría y reemplazaría todo.

Tenga en cuenta que la barra 'extra' en $ tree . ├── 02_2017 │   └── foo.txt └── bar.txt 5 no es un error tipográfico, pero no recuerdo exactamente por qué lo necesitaba. Tenía que ver con el ruta absoluta de Relativo vs. Dependiendo de su lista generada, puede necesitarlo, es posible que no. Pero veo que también estás trabajando con caminos relativos (./ Operador), así que probablemente lo necesitas.

Significa sin decir que para probarlo en la terminal, debe deshacerse del operador $ tree . ├── 02_2017 │   └── foo.txt └── bar.txt 6 . Solo pertenece en un guión que crea un ID de proceso. También recuerde eliminar su archivo creado temporalmente para mantener una carpeta ABCDEFGHIJKLMNABCDEFGHIJKLMN17 .

 

I tried to accomplish the same task and I received the same error some time ago. The idea was to find all files that were recently modified in a period and back them up separately. Although it is worth mentioning that despite the error from cp the files were being copied. Still I did not like to have an error in the script so I adjusted like this:

find /mnt/net_shares/common/ -type f -mtime -15 >> /tmp/common_mod15.$$.txt 

This will find all files modified the past 15 days and create a list of them in a text file. The $$ operator is the process ID of the script running. This ensures if I have overlapping processes they will not use the same file, makes it unique to the process ID.

rsync -azv --files-from=/tmp/common_mod15.$$.txt / /mnt/hd2/backups/local/mod15/common/ 

The second step is to use rsync instead of cp. You can define a text list with --files-from switch, and also it will compare files and only copy what has been modified from the files in my backup location. Whereas cp would copy and replace everything.

Note that the 'extra' slash in /tmp/common_mod15.$$.txt **/** /mnt... is not a typo but I do not remember exactly why I needed it. Had to do with relative vs absolute path. Depending on your generated list you might need it, you might not. But I see that you are working with relative paths also (./ operator) so probably you do need it.

Goes without say that to test it in terminal you need to get rid of the $$ operator. It only belongs in a script which creates a process ID. Also remember to delete your temporary created file to keep a clean /tmp folder.

 
 

Relacionados problema

2  ¿Cómo monitorear un archivo local para cambios, aplique un REGEX reemplazarlo y guardar / sobrescribir a un archivo de destino?  ( How to monitor a local file for changes apply a regex replace on it and save ov ) 
Me gustaría comenzar un script o algo que vea un archivo de texto para cambios. Cuando cambie el archivo, quiero ejecutarlo a través de un analizador REGEX pa...

0  Script Shell para instalar software y configurar la red  ( Shell script to install software configure network ) 
Oye, quería saber cómo, después de una nueva instalación de Ubuntu, puedo instalar todos los softwares esenciales (VLC, Apache, MySQL, PHP, Java, NetbeanSetc)...

3  dpkg sin shell  ( Dpkg with no shell ) 
¿Cómo ejecutar DPKG sin shell? Aquí está mi problema: HECHO Y AUTORUN.SH Script en mi clave USB. Para ejecutar este script, creé reglas en /etc/udev/ru...

2  Abra la carpeta principal de un enlace simbólico a través de clic con el botón derecho?  ( Open the parent folder of a symbolic link via right click ) 
Podemos abrir una carpeta principal de cualquier archivo usando Script Nautilus como #!/bin/bash nautilus "$1" Si hago este script en el enlace simbó...

9  ¿Cómo apagar Ubuntu después de (2 horas) de inactivo?  ( How to shutdown ubuntu after 2 hours of idle ) 
Correr: Xubuntu 14.04 32bit. He leído varias desactualizadas, no funcionando, trabajando diferente que quiero respuestas aquí y en otros lugares. Tuve un gu...

11  Ejecute scripts automáticamente en el servidor después de la conexión SSH  ( Run scripts automatically in server after ssh connection ) 
Cómo ejecutar un script automáticamente en el servidor Poco después de que el sistema del cliente establezca la conexión SSH con el servidor para ex: Supong...

135  ¿Cómo ejecutar un script simplemente haciendo doble clic en los archivos similares en Windows?  ( How to execute a script just by double clicking like exe files in windows ) 
¿Cómo puedo hacer que un script de Bash sea ejecutable haciendo doble clic al igual que ABCDEFGHIJKLMNABCDEFGHIJKLMN5 archivos en Windows? Lo intenté crean...

6  Mi función de bash se ejecuta solo una vez por terminal abierto  ( My bash function runs only once per terminal opened ) 
Cuando intento ejecutar mi función de bash, definida en .bashrc, por segunda vez en el mismo terminal, no funciona. El código es el siguiente: lspci6 ...

0  Diferentes etapas en la programación de bash  ( Different stages in bash programming ) 
Tengo un programa de bash con diferentes etapas como: $stage=1 if [ stage -le 1]; then echo "execute stage 1" fi if [ stage -le 2]; then echo "execute sta...

22  Script de bash que no se ejecuta desde crontab [duplicado]  ( Bash script not executing from crontab ) 
Esta pregunta ya tiene respuestas aquí : ¿Por qué los scripts de Crontab no funcionan? ...




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