2

Как удалить каталоги, но не файлы внутри них? Я пробовал следующее:

rm -di /Users/arthur/Desktop/MyFolder 

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

Я на Mac. Кстати, я хочу сделать это автоматически.

1 ответ1

6

Метод 1 - сначала переезд, затем удаление

Просто переместите файлы вверх на один каталог, а затем удалите его. Это сохранит иерархию файлов / папок.

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

Метод 2 - Автоматизация в функции оболочки

Вы можете поместить это в функцию оболочки, определенную в вашем ~/.bash_profile:

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

Как было сказано ранее, это приведет к удалению только родительской папки, сохраняя дочернюю иерархию без изменений.


Метод 3 - рекурсивное удаление

Если вы хотите рекурсивно удалить все папки и просто сохранить файлы, используйте следующее:

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
}

Обратите внимание, что это перезаписывает файлы с повторяющимися именами.


Метод 4 - рекурсивное удаление с дублированием осведомленности

Наконец, если вы хотите сохранить дубликаты файлов, вы можете проверить, существуют ли они уже. В этом случае мы добавим к ним строку случайного числа. Конечно, могут быть более сложные методы, но вы можете увидеть, к чему это приведет.

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
}

Циклический вывод результатов find объяснен здесь.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .