Como remover arquivos correspondentes do diretório A no diretório B na linha de comando?

Como remover arquivos correspondentes do diretório A no diretório B na linha de comando?

Eu tenho alguns arquivos duplicados em diretórios Ae Bcomo posso excluir os ingênuos Busando os nomes de arquivos Ado bash?

Como fazer isso em outros shells é um bônus bem-vindo.

Responder1

Mão Única:

#!/bin/bash
cd ~/B
for file in ~/A/*
do
    file1=$(basename "$file")
    [ -f "$file1" ] && { echo "deleting $file1 "; rm -- "$file1"; }
done

Responder2

Em uma linha

grep -f <(ls "A") <(ls "B") | xargs -I'{}' rm "B/{}"

mas funciona depende apenas do nome do arquivo e pode afetar subdiretórios vazios. Para evitar isso, use find -type f -maxdepth 1em vez de ls.

Para uma verificação mais segura, use o recibo @KasyA.

Responder3

find /path/to/dirA -type f -exec cmp -s '{}' '/path/to/dirB/{}' \; -exec echo rm -v '/path/to/dirB/{}' \;

Em um teste:

$ ls -1 /path/to/dirA
dupfile
file1inA

$ ls -1 /path/to/dirB
dupfile
file1inB

find /path/to/dirA -type f -exec cmp -s '{}' '/path/to/dirB/{}' \; -exec echo rm -v '/path/to/dirB/{}' \;
rm -v /path/to/dirB/./dupfile

nota: remova echoo que é usado para simulação.

Responder4

cd B

ls ../
A
B

comm <(ls ../A) <(ls ./) -1 -2 -z | xargs -0 rm

commmostra três colunas,

  1. exclusivo para arquivo1 (A)
  2. exclusivo para arquivo2 (B)
  3. existem em ambos

Então eliminamos a coluna 1, 2 por -1 -2. -zusaria NULL para delimitador. O padrão é `\n' nova linha.

Ao lidar com pipe e lista de strings arbitrárias como nome de arquivo, a transferência delimitada por NULL é segura.

informação relacionada