Метод 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
объяснен здесь.