В гостевой системе Linux на хосте Windows :файловые блокировки, созданные emacs, запрещают редактирование соответствующих файлов с помощью emacs и не могут быть удалены

Чтобы найти все каталоги, которые не содержат других имен, кроме *.tmp, desktop.ini, Thumbs.dbи/или.picasa.ini:

find. -type d -exec bash -O dotglob -c '
    for dirpath do
        ok=true
        seen_files=false
        set -- "$dirpath"/*
        for name do
            [ -d "$name" ] && continue  # skip dirs
            seen_files=true
            case "${name##*/}" in
                *.tmp|desktop.ini|Thumbs.db|.picasa.ini) ;; # do nothing
                *) ok=false; break
            esac
        done

        "$seen_files" && "$ok" && printf "%s\n" "$dirpath"
    done' bash {} +

Это будет использовать find, чтобы найти любые каталоги ниже текущего каталога (, включая текущий каталог ), и передать их сценарию оболочки.

Сценарий оболочки перебирает указанные пути к каталогам и для каждого из них расширяет *в нем (с параметром оболочки dotglob, установленным в bash, для обнаружения скрытых имен ).

Затем он просматривает список полученных имен и сопоставляет их с конкретными шаблонами и именами, которые мы хотели бы найти, (игнорируя каталоги ). Если он находит любое другое имя, которое не соответствует нашему списку, он устанавливает okвfalse(вместоtrue)и выходит из этого внутреннего цикла.

Переменная seen_filesстановится true, как только мы видим файл любого типа, кроме каталога(или символической ссылки на каталог). Эта переменная помогает нам не сообщать о подкаталогах, которые содержат только другие подкаталоги.

Затем он запускает $seen_filesи$ok(trueили false), и если они оба true, это означает, что каталог содержит по крайней мере один обычный файл, а содержит только имена файлов из нашего списка . ], он печатает путь к каталогу.

Вместо

set -- "$dirpath"/*
for name do

вы, очевидно, могли бы

for name in "$dirpath"/*; do

вместо этого.

Тестирование:

$ tree
.
`-- dir
    |-- Thumbs.db
    `-- dir
        |-- file.tmp
        `-- something

2 directories, 3 files
Здесь запускается команда

(find, выводящая результат...)

./dir

Это означает, что каталог ./dirсодержит только имена из списка (, игнорируя каталоги ), а ./dir/dirсодержит и другие вещи.

Если удалить [ -d "$name" ] && continueиз кода, каталог ./dirне будет найден, так как он содержит имя (dir), которого нет в нашем списке.

0
13.10.2021, 12:18
0 ответов

Теги

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