Que sequência de comandos posso usar para excluir diretórios, mas não seus arquivos?

2

Como eu excluo diretórios, mas não os arquivos dentro deles? Eu tentei o seguinte:

rm -di /Users/arthur/Desktop/MyFolder 

remove /Users/arthur/Desktop/MyFolder? y
rm: /Users/arthur/Desktop/MyFolder: Directory not empty

Estou em um Mac. BTW, eu quero fazer isso automaticamente.

    
por gadgetmo 03.04.2012 / 08:49

1 resposta

6

Método 1 - Primeiro se movendo e excluindo

Apenas mova os arquivos para cima em um diretório e exclua-o. Isso manterá a hierarquia de arquivos / pastas contida.

mv ~/Desktop/MyFolder/* ~/Desktop/MyFolder/..
rmdir ~/Desktop/MyFolder

Método 2 - Automatizando em uma função shell

Você pode colocar isso em uma função de shell definida no seu ~/.bash_profile :

function rmd () {
  if [ -d "$1" ]; then
    mv "$1"/* "$1"/..
    rmdir "$1"
  else
    echo "$1 is not a directory"
  fi
}

Como dito anteriormente, isso excluirá apenas a pasta pai, mantendo a hierarquia de filhos intacta.

Método 3 - Exclusão recursiva

Se você quiser remover recursivamente todas as pastas e apenas manter os arquivos contidos, use o seguinte:

function rmdr () {
  if [ -d "$1" ]; then
    p="$1"/..
    find "$1" -type f -exec mv '{}' "$p" \;
    rm -rf "$1"
  else
    echo "$1 is not a directory"
  fi
}

Observe que isso substitui arquivos com nomes duplicados.

Método 4 - Exclusão recursiva com reconhecimento duplicado

Finalmente, se você quiser manter arquivos duplicados, pode verificar se eles já existem. Nesse caso, vamos adicionar um número numérico aleatório. Claro, pode haver métodos muito mais sofisticados do que isso, mas você pode ver para onde isso está indo.

function rmdr () {
  if [ -d "$1" ]; then
    p="$1"/..
    # loop through all files
    while IFS= read -r -d '' file; do
      filename=$(basename "$file")
      # if it already exists, prefix with random number
      if [ -f "$p/$filename" ]; then
        mv "$file" "$p/$RANDOM-$filename"
      # if it doesn't exist, just move
      else
        mv "$file" "$p"
      fi
    done < <(find "$1" -type f -print0)
    # remove parent directory
    rm -rf "$1"
  else
    echo "$1 is not a directory"
  fi
}

Fazer um loop por meio de find output é explicado aqui .

    
por 03.04.2012 / 10:10