Encontre e mova arquivos até um nível

4

Estou tentando pesquisar arquivos com uma determinada extensão e, em seguida, movo todos eles para um nível na hierarquia de pastas.

Basicamente, tenho algo parecido com

/path/to/application/files/and/stuff/a1/nolongerneededirectory/*.*
/path/to/application/files/and/stuff/a2/nolongerneededirectory/*.*
/path/to/application/files/and/stuff/a3/nolongerneededirectory/*.*

Estou tentando movê-los assim:

/path/to/application/files/and/stuff/a1/*.*
/path/to/application/files/and/stuff/a2/*.*
/path/to/application/files/and/stuff/a3/*.*

O ideal seria fazer algo como:

-bash-3.2$ find /path/to/ -name '*.txt'
output:
/path/to/directories1/test1/test1.txt
/path/to/directories2/test2/test2.txt
/path/to/directories3/test3/test3.txt

then 
mv /path/to/directories1/test1/test1.txt /path/to/directories1/test1.txt
mv /path/to/directories2/test2/test2.txt /path/to/directories2/test2.txt
mv /path/to/directories3/test3/test3.txt /path/to/directories3/test3.txt

Eu tenho jogado com diferentes opções e perguntando por aí, alguém tem alguma idéia?

EDIT 1:

Então eu tentei

'find /path/to/parent/dir -type f -exec mv {} .. \

mas recebo uma permissão negada

    
por ideal2545 20.04.2012 / 19:56

2 respostas

1

Se você tiver encontrar GNU , você pode fazer (modificado do seu exemplo):

find /path/to -type f -execdir mv {} .. \;

mas o Solaris usa POSIX como padrão, que não possui essa opção. Às vezes, as ferramentas GNU estão disponíveis (como por exemplo, gfind ).

Além disso, a opção -mindepth provavelmente seria muito útil nesse caso para retornar apenas arquivos em uma determinada profundidade de diretório mínima.

Sem o GNU find , usando um script:

#!/bin/sh
IFS='
'
for i in $(find /path/to -type f); do
    echo mv -- "${i}" "${i%/*/*}"
done

Isso funcionará, a menos que os nomes dos arquivos contenham novas linhas. Execute-o como acima primeiro e remova o echo se ele estiver OK (veja também a observação -mindepth acima).

    
por 22.04.2012 / 14:34
1

Crie um script chamado move_to_parent.sh , torne-o executável.

#!/bin/bash

while [ $# -ge 1 ]
do
   parentPath=${1%/*/*};
   cp "$1" $parentPath;
   shift
done

Informações sobre a substituição de parâmetros encontrada .

Aqui está outra maneira de escrever move_to_parent.sh usando awk -

#!/bin/bash

while [ $# -ge 1 ]
do
   echo $1 | awk -F/ '
             {
                parentPath="";

                for(loop=2;loop<NF-1;loop++)
                {
                   parentPath=parentPath"/"$loop;
                }
                sub(/\ /, "\ ", $0);
                system("mv " $0 " " parentPath );
             }'
   shift
done

Execute da seguinte forma -

find /path/to/parent/dir -iname "*.txt" | xargs  /path/to/scripts/move_to_parent.sh
    
por 21.04.2012 / 07:40