Я использую Ubuntu 18.04, 19.10
использование #!/bin/bash
напишите сценарий, как удалить каталоги, если они пусты от дальнего конца и остановки в каталоге, имеющем какой-либо файл/файлы.
сказать.. Я создал несколько каталогов с ниже команды
mkdir -p $HOME/.local/my/sub/directories/1/2/3
lateron в течение времени я создал партию файлов во всех каталогах, начинающих с каталога "мой к 1/2/3".
Через какое-то время я удалил все файлы в каталогах "мой", "каталоги", "1", "2", "3". Отметьте тот каталог sub
имеет некоторые файлы..
mkdir -p
опция будет видеть, существуют ли родительские каталоги в команде mkdir -p $HOME/.local/my/sub/directories/1/2/3
и его сейф.
Вопрос: как вышеупомянутое там любая команда, чтобы видеть, пусты ли каталоги и удаляют из дальнего конца и остановки в каталоге sub
Я имею в виду $HOME/.local/my/sub
Реверсирование mkdir -p
команда была бы rmdir -p
. rmdir -p
удалит структуру папок до папки, не пусто. Необходимо смочь использовать rmdir
вместо mkdir
на Вашей команде:
rmdir -p $HOME/.local/my/sub/directories/1/2/3
Можно также указать подстановочные знаки как если Ваш $HOME/.local/my/sub/
содержавший как directories1
, directories2
и directories3
например, это могло быть сделано как:
rmdir -p $HOME/.local/my/sub/directories*/1/2/3
или
rmdir -p $HOME/.local/my/sub/*/1/2/3
Если какая-либо папка, поскольку это удаляет их, будет содержать данные или другую папку, то Вы получите сообщение об ошибке, что каталог не пуст и остановки.
rmdir: failed to remove directory '/home/user/.local/my/sub': Directory not empty
Надеюсь, это поможет!
Существует два способа, которыми я делал бы попытку этого. Легкий метод следующие:
# Command to return only empty directories in the current directory:
find . -type d -empty -print
Теперь на моей версии Ubuntu, я могу просто выполнить следующее:
# Find empty files, and delete them:
find . -type d -empty -delete
Иначе можно создать некоторый сценарий с логикой, чтобы считать файлы в каталоге и удалить их. Вот начальная точка для подсчета файлов в подкаталогах:
#!/bin/bash
for i in */ .*/ ; do
echo -n $i": " ;
(find "$i" -type f | wc -l) ;
done
Это ближе к реверсу mkdir -p
:
$ cat deldir
#!/bin/bash
[[ $# = 0 ]] && { echo "usage: ${0##*/} DIRECTORY..." >&2; exit 1; }
rc=0
while [[ $# != 0 ]] ;do
dir=${1%/} # in case someone specifies DIRECTORY/ out of habit
shift
while true ;do
rmdir -- "$dir" || { rc=1; break; }
[[ $dir = */* ]] || break
dir=${dir%/*}
done
done
exit $rc
Пример:
mkdir -p a/b/c x/y/z
deldir a/b/c x/y/z