Как удалить все файлы в каталоге, кроме скрытых?

Благодаря Mark Plotnick я смог определить и устранить проблему.

Проблема заключается во взаимодействии между файловой системой AFS, используемой сервером, и Kerberos, выполняющим аутентификацию. Та же проблема была поднята в этом вопросе на SO.

По сути, происходит следующее: когда я вхожу на сервер по ssh, Kerberos выдает токен аутентификации для сессии. Этот токен также используется для доступа к файловой системе AFS. При закрытии сеанса SSH этот токен уничтожается, и запущенные процессы начинают получать ошибки отказа в разрешении при попытке доступа к файлам на AFS.

Способ исправить это - запустить новое окно внутри screen/tmux и запустить команду:

kinit && aklog

После этого вы можете отсоединиться от screen/tmux и безопасно закрыть сессию ssh.

Команды выше создают новые токены Kerberos и связывают их с сессией screen/tmux, таким образом, при закрытии ssh-соединения начальные токены будут отозваны, но поскольку подпроцессы теперь используют созданные вами токены, они не будут страдать от ошибок отказа в разрешении.


Подведем итоги:

  • ssh username@server
  • tmux
  • Запускаем процесс, который нужно сохранить
  • Создаем новое окно с помощью Ctrl+B, C
  • kinit && aklog
  • Отключаемся от сессии с помощью Ctrl+B, D
  • Закрываем ssh-сессию

5
11.06.2015, 20:48
2 ответа

Проблема в том, что рекурсивное удаление rm -r *ведет себя иначе, чем нерекурсивное rm *в отношении скрытых файлов. Первый удаляет их, а второй нет (с параметрами оболочки по умолчанию). Но, конечно, рекурсия нужна для того, чтобы удалять подкаталоги.

Мое решение состоит в том, чтобы использовать перемещение, которое оставляет скрытые файлы на месте, вместо удаления. Это еще пара строк, но имеет смысл, когда вы это делаете (нет лишних вариантов для запоминания).

mkdir ../deleteme
mv * ../deleteme
rm -rf ../deleteme
4
27.01.2020, 20:34

rm *отлично работает, если ваш каталог не содержит подкаталогов (см. ответ @kos). Однако, если вам нужно рекурсивное решение, которое также удаляет все подкаталоги, то (, как указал @meesern ,)rm -r *не то, что вам нужно, поскольку действительно удаляет скрытые файлы и подкаталоги.

Вместо этого вы можете использовать findдля отображения и удаления не -скрытых файлов и подкаталогов (, адаптированных из этого ответа):

find YOUR_DIRECTORY -not -path '*/\.*' -delete

Это приведет к удалению всех не-скрытых файлов в YOUR_DIRECTORYи всех подкаталогах, которые стали пустыми после удаления не-скрытых файлов.

Он не будет удалять содержимое внутри скрытого каталога (, например. YOUR_DIRECTORY/.foo/bar/baz). В результате вы можете получить некоторые предупреждения, такие как

find: cannot delete 'some/directory/here': Directory not empty

Но вы можете смело игнорировать их.

0
27.01.2020, 20:34

Теги

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