Curinga não funcionando no comando cp ao usar exec

3

Eu quero copiar todos os arquivos em todos os diretórios para o diretório pai, mas recebo o erro

./img/* is not a directory

Por exemplo. Aqui está o comando que eu usei. Existe uma maneira melhor de fazer isso?

find . -type d -regex './[a-z]*' -exec cp -v {}/* .. \;
    
por m0meni 19.02.2015 / 03:56

2 respostas

2

Tente:

find . -type d -regex './[a-z]*' -exec bash -c 'cp -v "$1"/* ..' Cp {} \;

Discussão

Considere:

find . -type d -regex './[a-z]*' -exec cp -v {}/* .. \;

Quando o bash vê essa linha, ele executa a expansão do nome do caminho em {}/* . Como não há diretório chamado {} , o * é deixado como um literal * . Isto não é o que você quer. Você precisa que a expansão do nome de caminho ocorra após find ter substituído {} . Colocando o comando cp entre aspas e passando-o como um argumento para bash -c , alcançamos esse objetivo.

Um exemplo de formulário para bash -c se parece com:

bash -c 'code...' a b c 

Isso diz ao bash para atribuir a a $0 , b a $1 , c a $2 e, em seguida, executar code... . Quando ocorre um erro, o shell usa $0 como o nome do programa que está sendo executado. Acima, escolhemos Cp como um nome descritivo. Além disso, como acima, {} é substituído por $1 e usamos $1 no code... . Quando usado dessa maneira, {} deve ser deixado sem aspas: find manipula qualquer escape necessário. No interior code... , no entanto, $1 deve estar entre aspas duplas para proteger contra a divisão de palavras e a expansão do nome de caminho.

    
por 19.02.2015 / 04:08
1

Isso também pode funcionar

cd your_directory
cp -rp * /absolut_path_to_parent_directory
    
por 19.02.2015 / 11:01