Para o seu caso de uso, você pode evitar identificar os diretórios comuns, porque rm -rf
apenas ignora os não existentes.
Então, é suficiente para find
todos diretórios em dir1
e excluí-los de dir2
:
find dir1 -mindepth 1 -maxdepth 1 -type d -printf "dir2/%ffind dir1 -mindepth 1 -maxdepth 1 -type d -printf "dir2/%ffind dir1 -mindepth 1 -maxdepth 1 -type d -printf "dir2/%ffind dir1 -mindepth 1 -maxdepth 1 -type d -printf "dir2/%ffind dir1 -mindepth 1 -maxdepth 1 -type d -printf "dir2/%ffind dir1 -mindepth 1 -maxdepth 1 -type d -printf "dir2/%f%pre%" |xargs -0 -r ls -d -- 2>/dev/null
" |xargs -0 echo rm -rf --
" |xargs -0 rm -rf --
" |xargs -0 -r ls -d -- 2>/dev/null
" |xargs -0 echo rm -rf --
" |xargs -0 rm -rf --
Algumas explicações. Por padrão, find
imprimiria todos os diretórios com o caminho completo, que é dir1
. Portanto, estamos usando -printf
para imprimir apenas o nome do arquivo sem os diretórios principais (% f), além do outro caminho "dir2" onde queremos excluir. Além disso, terminamos a string com byte nulo '\ 0' em vez de nova linha para usar xarg
option -0
, o que torna tudo isso seguro em relação a nomes de arquivos com espaços. Então xargs
lerá stdin e executará o comando rm
adicionando todas as strings como argumentos.
Note que, antes de excluí-los, você pode testar sua linha de comando adicionando echo
para imprimir apenas os comandos rm
:
Para apenas listar os diretórios comuns, você pode usar ls
em vez de rm
(adicionando 2 > / dev / null para ignorar os não existentes):