Metoda 1 - Najpierw przenieś, a następnie usuń
Po prostu przenieś pliki w górę o jeden katalog, a następnie usuń go. Pozwoli to zachować zawartą hierarchię plików / folderów.
mv ~/Desktop/MyFolder/* ~/Desktop/MyFolder/..
rmdir ~/Desktop/MyFolder
Metoda 2 - Automatyzacja w funkcji powłoki
Możesz umieścić to w funkcji powłoki zdefiniowanej w ~/.bash_profile
:
function rmd () {
if [ -d "$1" ]; then
mv "$1"/* "$1"/..
rmdir "$1"
else
echo "$1 is not a directory"
fi
}
Jak powiedziano wcześniej, spowoduje to usunięcie tylko folderu nadrzędnego, pozostawiając nienaruszoną hierarchię dzieci.
Metoda 3 - Usuwanie rekurencyjne
Jeśli chcesz rekurencyjnie usunąć wszystkie foldery i po prostu zachować pliki w folderze, użyj następujących poleceń:
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
}
Pamiętaj, że to zastępuje pliki ze zduplikowanymi nazwami.
Metoda 4 - Usuwanie rekurencyjne ze zduplikowaną świadomością
Wreszcie, jeśli chcesz zachować duplikaty plików, możesz sprawdzić, czy już istnieją. W takim przypadku poprzedzimy je ciągiem liczb losowych. Oczywiście mogą istnieć znacznie bardziej wyrafinowane metody, ale widać, dokąd to zmierza.
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
}
Pętla find
wyjścia jest wyjaśniona tutaj .