Exclui arquivos em um diretório que também esteja em outro diretório

5

Eu copiei um diretório usando isto:

cp -r dir/ ../../

sem pensar e percebeu que copiou o conteúdo de dir em vez de dir para o diretório acima. Agora eu tenho uma confusão de arquivos que eu preciso excluir para que eu possa refazer o cp corretamente. Como posso apagar todos os arquivos que copiei por engano se eles não correspondem a nada em particular?

    
por n0pe 31.08.2011 / 14:02

3 respostas

5

Ok, isso é basicamente o mesmo que klapaucius 'answer . (E não reparará nenhum dano se cp tiver sobrescrito alguns arquivos existentes.)

Supondo que você esteja no diretório de origem (em dir ). Este comando:

find . -type f echo '{}' ';'

listará todos os arquivos (recursivamente) presentes no diretório dir (semelhante a -print ). A opção -type f está lá para impedir a listagem de subdiretórios.

Então, se você usar:

find dir -type f -exec echo '../../../{}' ';'

Isso deve listar os arquivos correspondentes (cópias) no diretório de destino.

Agora, se a lista estiver correta, você poderá remover as cópias usando:

find dir -type f -exec rm -- '../../../{}' ';'

Como para a remoção de diretórios vazios remanescentes que vêm do cp … hum…

    
por 31.08.2011 / 15:03
2

Use find em combinação com -exec . Melhor testar com ls antes assim:

find . -name "*" -exec ls ../../{} \;
    
por 31.08.2011 / 14:08
2

O código a seguir manipula nomes de arquivos que contêm novas linhas incorporadas Eu coloquei um script de versão completa em paste.ubuntu . Ele verifica a existência e os tamanhos correspondentes ... O código para gerar os dados de teste também está incluído.

# This lists the original fully-qualified filename, 
# and its would-be counterpart (assuming it exists) 
unset a i
while IFS= read -r -d $'
WARNING -----
NOT in target   ./file1
ok --------
sizes match     ./c/file4-in-subdir
WARNING ------
size mis-match  ./file3   is   triple-spaced
ok --------
sizes match     ./file2
has newline!
' relf; do printf "%s\n$s" "$PWD${relf:1}" "$(dirname "$(dirname "$PWD")")${relf:1}" done < <(find . -type f \! -name '.' -name '*' -print0)

Aqui está um exemplo de saída da versão completa (mencionada acima), onde um arquivo está faltando, e outro tem um tamanho de arquivo diferente do original

# This lists the original fully-qualified filename, 
# and its would-be counterpart (assuming it exists) 
unset a i
while IFS= read -r -d $'
WARNING -----
NOT in target   ./file1
ok --------
sizes match     ./c/file4-in-subdir
WARNING ------
size mis-match  ./file3   is   triple-spaced
ok --------
sizes match     ./file2
has newline!
' relf; do printf "%s\n$s" "$PWD${relf:1}" "$(dirname "$(dirname "$PWD")")${relf:1}" done < <(find . -type f \! -name '.' -name '*' -print0)
    
por 31.08.2011 / 19:50