Como copiar todos os arquivos finais em um diretório para outro diretório no unix?

0

Como posso copiar todos os arquivos encontrados em subpastas dentro de um diretório para outro diretório? Estou tendo problemas com isso porque alguns dos arquivos finais estão em mais pastas que outros.

Eu conheço pessoas usando o find para que você possa encontrar determinados finais para nomes de arquivos como .txt, mas meus arquivos não têm nenhum tipo de arquivo

Atualmente tenho cp -r cs / cs / 201 * sp /. tudo /

O problema é que eu tenho duas pastas que contêm arquivos que precisam ser copiados, que são um subconjunto de 201 * sp /

Atualmente, ele copia todos os itens corretos que não estão nessas duas pastas, mas copia essas pastas, quando eu preciso apenas copiar o conteúdo delas.

    
por blurble 16.02.2014 / 01:44

2 respostas

0

find cs/cs/201*sp/ -type f -exec cp {} all/ \;

    
por 16.02.2014 / 07:58
0

Se eu entendi o que você precisa é uma maneira de olhar dentro de uma pasta e todas as subpastas dessa pasta e copiar todos os arquivos encontrados em uma pasta "destino" diferente, sem criar subpastas na pasta "destino". / p>

Então, se você tem um conjunto de arquivos como este:

folderA/file1
folderA/subfolderC/file2
folderA/subfolderC/subD/file3
folderA/subfolderC/subE/file4
folderB/subfolderF/file5
folderB/subfolderG/subH/file6
folderB/subfolderG/subI/file7

Você está copiando os arquivos para a pasta "../destfolder" . Então, depois que os arquivos forem copiados, o "../destfolder" conterá:

../destfolder/file1
../destfolder/file2
../destfolder/file3
../destfolder/file4
../destfolder/file5
../destfolder/file6
../destfolder/file7

e "../destfolder" conterão nenhum das subpastas de "folderA" ou "folderB" .

Você faz isso alterando para o diretório do qual deseja copiar os arquivos e, em seguida, o executa a partir do prompt de comando:

d="../destfolder";for f in $(find -type f -exec echo {} \;); do b=$(echo $f|sed -r 's!^.*/([^/]+)!!'); echo cp -p "$f" "$d/$b" ;done

Antes de "executar" este comando, você precisará substituir sua pasta de destino real no lugar de "../destfolder"

Isso exibirá uma lista dos comandos cp , mas não copiará arquivos. Deve ficar assim:

cp -p folderA/file1 ../destfolder/file1
cp -p folderA/subfolderC/file2 ../destfolder/file2
cp -p folderA/subfolderC/subD/file3 ../destfolder/file3
cp -p folderA/subfolderC/subE/file4 ../destfolder/file4
cp -p folderB/subfolderF/file5 ../destfolder/file5
cp -p folderB/subfolderG/subH/file6 ../destfolder/file6
cp -p folderB/subfolderG/subI/file7 ../destfolder/file7

Quando tiver certeza de que os arquivos corretos serão copiados, você poderá executar o comando novamente, mas remover "echo" da parte do comando que é como: "echo cp -p..."

Assim, o comando que copiará os arquivos será parecido com:

d="../destfolder";for f in $(find -type f -exec echo {} \;); do b=$(echo $f|sed -r 's!^.*/([^/]+)!!'); cp -p "$f" "$d/$b" ;done

Lembre-se de que antes de "executar" este comando, você precisará substituir sua pasta de destino real em vez de "../destfolder"

Se você quiser isso como um script de shell, ficaria assim:

#!/bin/sh

d="../destfolder"

for f in $(find -type f -exec echo {} \;); do 
    b=$(echo $f|sed -r 's!^.*/([^/]+)!!')
    echo cp -p "$f" "$d/$b"
done


Se isso não é exatamente o que você precisa, então me avise e eu vou dar uma outra olhada nisso.

    
por 16.02.2014 / 08:15

Tags