use apenas o nome do arquivo para mover

use apenas o nome do arquivo para mover

Tenho que mover alguns arquivos de uma pasta para outra, critérios definidos por find e grep. Quando tento mover os arquivos ele quebra.

O movimento real que ele está tentando émv /somefolder/export//somefolder/storage/testfileOLD.txt

O que eu esperava eramv /somefolder/storage/testfileOLD.txt /somefolder/export/testfileOLD.txt

O comando que estou usando:

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

Já tentei com -exec basename {}isso me dá o resultado certo, mas quando modifico o mv para

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

para verificar se funciona, ainda me dá o arquivo /somefolder/export//somefolder/storage/testfileOLD.txt.

Responder1

$(basename {})falhará (melhor: seja apenas uma string vazia). O subshell invocado aqui não se expande {}para o nome do arquivo, pois é específico para localização e não é exportado para o subshell criado pelo seu comando.

Você pode testar isso executando

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

Eu sugiro que você escreva um pequeno script:

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

e execute-o em seu findcomando:

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

AFAIK, o comportamento de encaminhamento '{}'para subshells depende da sua findversão.

Responder2

Se você quiser manter a estrutura original abaixo do diretório /somefolder/somedir, poderá usar rsyncem vez de mv.

Configuração de teste:

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

Resultado esperado após a mudança:

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

Os 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

informação relacionada