@Praveen J Kumar, я не так ясно выразился, так что постараюсь осветить основы. Здесь есть четыре случая:
Вы do хотите получить подсказку при удалении каталога. Флаг -i
предназначен для интерактивной сессии, и будет запрашивать вас перед тем, как удалить каждый файл. -r
предназначен для рекурсивного режима, т.е. просмотра всей директории и подкаталогов etc..... Затем используйте:
$ rm -ri <путь к каталогу>.
Вы не хотите запрашивать при удалении каталога, тогда используйте:
$ rm -r < путь к каталогу>.
Вы хотите удалить только определенные типы файлов в каталоге . Для этого можно использовать строку ниже, где ls -1
предоставляет один строчный ввод, grep -iv "jpg"
выберет все файлы из вывода ls
, которые не являются форматом jpg
(здесь -i
флаг для нечувствительных к регистру файлов и -v
- ни для чего, кроме строки "jpg"), и xargs rm
выполняет rm
на выходе grep
. Например, я хочу удалить все файлы в каталоге, кроме jpg
:
$ ls -1
один.текст
три jpg
тривью
три.ш
два.txt
$ лс -1 | grep -iv "jpg" | xargs rm
$ ls
три jpg
rmdir
по умолчанию не удаляет не пустые каталоги, так что вы хороши :-).
Последняя заметка: при выборе флага -i
может стать утомительным, если в каталоге много файлов, так как он будет запрашивать каждый файл.
rmdir
не предоставляет флаг -i
, как команда rm
, когда вы хотите подтвердить удаление определенный каталог. Однако rmdir
возвращает код выхода 0
, когда он работает с пустым каталогом. Например:
$ mkdir emptydir && rmdir emptydir && echo $?
0
Как видите, он не запрашивает подтверждения при удалении пустого каталога. Единственный способ создать механизм подтверждения для rmdir
- это написать оболочку, которую мы называем rmemptydir
. Я написал две версии, показывающие два разных подхода.
Предпочтительный подход
#!/bin/bash
[[ $# = 0 ]] && printf '%s\n' "rmdir [dirname]" exit 1
shopt -s nullglob dotglob
files=( ${1+"$1/"}* )
(( ${#files[*]} )) || { rm -ri "$1" && exit 1; } && printf '%s\n' "Dir not empty"
shopt -u nullglob dotglob
1) Скрипт принимает один параметр, который является именем каталога. Он завершается, если не указан параметр
2) Позиционный параметр $ 1
содержит каталог (как массив с элементами)
3) Количество элементов массива проверяется, и если это не так ] 0
затем перейдите к printf '% s \ n' "Директория не пуста"
иначе выполните rm -ri "$ 1" && exit 1
, и все готово.
То же самое применимо ко второму подходу, за исключением того, что мы используем pushd
и popd
для push
каталог в стек и pop
его из стека.
Интересно, как это работает в фоновом режиме?
Поместите set -x
сразу под #! / Bin / bash
и удалите > / dev / null
после pushd
и popd
Второй подход с использованием pushd
и popd
#!/bin/bash
if [[ $# = 0 ]]; then
printf '%s\n' "rmdir [dirname]"
exit 1
fi
shopt -s nullglob dotglob
pushd "$1" >/dev/null
files=(*)
(( ${#files[*]} )) || { popd >/dev/null && rm -ri "$1" && exit 0 ;} && printf '%s\n' "Dir not empty"
shopt -u nullglob dotglob
Следующее не работает, поскольку rmdir
может удалять только пустые директории, и мы имеем music.mp3
в нашем каталоге.
mkdir emptydir && touch emptydir/music.mp3 && rmdir emptydir && echo $?
rmdir: failed to remove ‘emptydir’: Directory not empty