удалите содержание каталога изящным способом

Часто можно искать этот вид вопроса в Розеттском камне для Unix. Это ничего не перечисляет для lsof под SCO. Но можно загрузить и скомпилировать lsof для SCO, как для примерно каждого существующего варианта Unix.

1
15.06.2013, 11:42
8 ответов
rm -rf -- * .*

Это портативно и работы, но это ужасно, потому что кроме с zsh, это выдает предупреждения:

rm: cannot remove directory: `.'
rm: cannot remove directory: `..'
6
27.01.2020, 23:12
  • 1
    Да, можно адаптироваться с материалом как [^.] но затем у Вас будут другие проблемы (как названные папки ..abc); таким образом я сомневаюсь, что можно избавиться от этих противных предупреждений. Это не "чистая" опция, но это работает. –  Tamara Wijsman 11.04.2013, 13:07
  • 2
    @TomWijsman, [^.] не POSIX, [!.] . –  Stéphane Chazelas 11.04.2013, 13:46
  • 3
    @StephaneChazelas: Если Вы нуждаетесь в POSIX, то преобразовываете синтаксис, я не забочусь... –  Tamara Wijsman 11.04.2013, 14:04

Попробуйте это:

find . -maxdepth 1 -not -name \. -exec rm -rf \{\} ;
2
27.01.2020, 23:12

POSIXly:

rm -rf -- * .[!.]* ..?*

Тот мог перестать работать, если список файлов он слишком большой, этот не будет:

find . ! -name . -prune -exec rm -rf {} +

С zsh:

rm -rf -- *(D)
2
27.01.2020, 23:12

Лучшее решение, которое я нашел, к:

find . -delete

однако, - удаляют предикат, опасно (см. человека), и мне не нравится использовать его.

Обновление:

Мне не нравится -delete предикат, потому что это может вызвать аварию при использовании кем-то не знакомым с деталями логики находки. Например:

find . -delete -name '*.bak'  # DO NOT DO IT!!!

Кто-то может ожидать, что такой вызов удалит только '*.bak' файлы, но это - точный эквивалент find . -delete.

1
27.01.2020, 23:12
  • 1
    Это должно быть наилучшим вариантом; я не вижу, почему это было бы опасно, это - логика для помещения его в конец, и можно сначала выполнить его без этого для наблюдения то, что это удалило бы. –  Tamara Wijsman 11.04.2013, 13:05
  • 2
    @TomWijsman в этом случае -delete прекрасен, но в целом -delete опасно, это - то, почему мне не нравится он. –  Michał Šrajer 11.04.2013, 13:22
  • 3
    -delete не POSIX. –  Stéphane Chazelas 11.04.2013, 13:37
  • 4
    Что относительно -exec rm -rf {} \;? –  Tamara Wijsman 11.04.2013, 14:01

как насчет

 rm -rf * .[a-z]* .[A-Z]* .[0-9]*

это будет работать? или у Вас есть другие шаблоны имени файла для соответствия также?

0
27.01.2020, 23:12
  • 1
    в posix файловой системе, почти любой символ может быть в имени файла. Попробовать touch '#'. –  Michał Šrajer 11.04.2013, 13:03
  • 2
    Ограничение определенными символами не действительно надежно; Вы отсутствуете часто используемый . и - например, но даже включая их можно столкнуться с a _ или другие менее частые символы. –  Tamara Wijsman 11.04.2013, 13:08

другая опция состоит в том, чтобы помнить значение pwd, cd .., rm -rf каталог и воссоздает каталог. Это также ужасно по многим причинам.

BTW, не вниз-голосуйте. Комментарий в случае необходимости.

0
27.01.2020, 23:12

Сначала удалите файлы, затем пустые каталоги:

find . -type f -exec rm \{\} \;
find . -depth -type d -empty -exec rmdir \{\} \;
0
27.01.2020, 23:12
  • 1
    эта "тривиальная задача" действительно ли получение является сумасшедшей... ;-) –  Michał Šrajer 11.04.2013, 13:28
  • 2
    -empty не POSIX. -type f для регулярных файлов только. Вы пропустили бы другие типы файлов как символьные ссылки, сокеты, каналы, двери, устройства... Использовать ! -type d вместо этого. –  Stéphane Chazelas 11.04.2013, 13:52
rm -rf .

Это, конечно, не работает вообще, однако это:

rm -rf -- "$PWD"

удаляет CWD, и мы заканчиваем в рамках несуществующего каталога. Это очень ужасно.

BTW, не вниз-голосуйте. Комментарий в случае необходимости.

-2
27.01.2020, 23:12
  • 1
    Ну, это не удаляет "содержание" каталога. –  Tamara Wijsman 11.04.2013, 13:06
  • 2
    @TomWijsman. Согласиться. Поэтому этому было бы нужно воссоздание каталога. Еще одно ужасное решение... –  Michał Šrajer 11.04.2013, 13:09

Теги

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