Utilice sólo el nombre del archivo para mover.

Utilice sólo el nombre del archivo para mover.

Tengo que mover algunos archivos de una carpeta a otra, criterios establecidos por find y grep. Cuando intento mover los archivos, se rompe.

El movimiento real que está intentando esmv /somefolder/export//somefolder/storage/testfileOLD.txt

Lo que esperaba eramv /somefolder/storage/testfileOLD.txt /somefolder/export/testfileOLD.txt

El comando que estoy usando:

find /somefolder/storage/ -type f -name "*OLD*" -newermt '2019-05-1' ! -newermt '2019-06-7' -exec grep -qiF 'closed' {} \; -exec mv {} /somefolder/export/{} \;

Ya probé con -exec basename {}, esto me da el resultado correcto, pero cuando modifico el mv a

-exec echo {} /somefolder/export/$(basename {}) \;

para comprobar si funciona todavía me da el /somefolder/export//somefolder/storage/testfileOLD.txt.

Respuesta1

$(basename {})fallará (mejor: simplemente será una cadena vacía). El subshell invocado aquí no se expande {}al nombre del archivo, ya que es específico de buscar y no se exporta al subshell que crea su comando.

Puedes probar esto ejecutando

find -exec echo "this will be empty:" $(basename '{}') \;

Te sugiero que escribas un pequeño guión:

#!/bin/bash
mv "$1" /somefolder/export/"$( basename ${1})"

y ejecútelo en su findcomando:

find /dir/ <specs> -exec grep -qiF 'closed' '{}' \; -exec bash script.sh '{}' \;

AFAIK, el comportamiento del reenvío '{}'a subcapas depende de su findversión.

Respuesta2

Si desea conservar la estructura original debajo del directorio /somefolder/somedir, puede utilizar rsyncen lugar de mv.

Configuración de prueba:

/somefolder/storage/testfileOLD.txt
/somefolder/storage/subdir/fileOLD.txt

Resultado esperado después del movimiento:

/somefolder/export/testfileOLD.txt
/somefolder/export/subdir/fileOLD.txt

Los comandos:

# first, create a file list of relative paths (some arguments removed for simplicity)
$ find /somefolder/storage -type f -name "*OLD*" -printf '%P\n' > /tmp/filelist

# cat to illustrate its content
$ cat /tmp/filelist
subdir/fileOLD.txt
testfileOLD.txt

# then rsync using `--remove-source-files` to move the files 
$ rsync -av --remove-source-files --files-from=/tmp/filelist /somefolder/storage /somefolder/export

información relacionada