Получение подсказки, когда deleteing некаталог

Заменить - цвет с -G при запуске LS .

-2
12.08.2014, 23:36
2 ответа

@Praveen J Kumar, я не так ясно выразился, так что постараюсь осветить основы. Здесь есть четыре случая:

  1. Вы do хотите получить подсказку при удалении каталога. Флаг -i предназначен для интерактивной сессии, и будет запрашивать вас перед тем, как удалить каждый файл. -r предназначен для рекурсивного режима, т.е. просмотра всей директории и подкаталогов etc..... Затем используйте:

    $ rm -ri <путь к каталогу>.
    
  2. Вы не хотите запрашивать при удалении каталога, тогда используйте:

    $ rm -r < путь к каталогу>.
    
  3. Вы хотите удалить только определенные типы файлов в каталоге . Для этого можно использовать строку ниже, где 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
    
  4. rmdir по умолчанию не удаляет не пустые каталоги, так что вы хороши :-).

Последняя заметка: при выборе флага -i может стать утомительным, если в каталоге много файлов, так как он будет запрашивать каждый файл.

2
28.01.2020, 05:15

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
1
28.01.2020, 05:15

Теги

Похожие вопросы