Como expressar todos os arquivos / diretórios na opção extra -exec do comando 'find'?

1

Eu tenho uma tarefa para copiar todos os arquivos de vários diretórios com nomes especiais para um diretório de destino.

Então eu construo este diretório para testar meu comando. A árvore de diretórios de teste se parece com:

.
├── dir1
│   └── file1
└── test

Meu comando pretendido para converter todos os arquivos do dir1 para o teste é:

find . -type d -name "*dir*" -exec mv {}/* test \;

Então eu peguei:

mv: rename ./dir1/* to test/*: No such file or directory

Eu acho que isso é porque nessa expressão extra -exec, o comando não tratou o * como um caractere curinga.

Então eu fiz:

find . -type d -name "*dir*" -exec mv {}/file1 test \;

Que moveu file1 com sucesso para teste.

Mas o ponto é, eu preciso agora a expressão para todos os arquivos para que eu possa realizar este trabalho de transferência de arquivos.

Como devo expressar isso no grupo de comando find -exec ?

    
por Zen 16.01.2015 / 04:53

3 respostas

2

mv "$dir_path"/* ... não apenas moverá arquivos, mas tudo em "$dir_path" . Pelo menos tudo cujo nome não começa com um ponto (arquivos ocultos). No bash você pode mudar isso com a opção dotglob . Mas se o * se expande muito bem (combina tudo, mas não muito para uma linha de comando), então você pode usar um shell para indireção:

find . -type d -name "*dir*" -exec bash -c 'mv "$0"/* /path/to/test' {} \;
    
por 16.01.2015 / 05:06
2

Tente:

$ find -type d -name '*dir*' -exec sh -c '
  for d do
    for f in "$d"/*; do
      [ -f "$f" ] && mv -- "$f" /path/to/test
    done
  done
' sh {} +
    
por 16.01.2015 / 05:19
0

Você também pode tentar isso. Considerando que o diretório de teste está no mesmo diretório com outros diretórios,

find . -mindepth 2  ! -name test -exec cp {} test \;

Isto irá copiar todos os arquivos individuais para o teste de diretório, escapando do dir1, dir2 etc. Observe que isso omitirá os subdiretórios e copiará o conteúdo deles. você também pode testar isso usando o comando ls.

find . -mindepth 2  ! -name test -ls 
    
por 16.01.2015 / 11:02