Темы Xfce4, не отображаемые в Debian Buster

Мнения экспертов об этом маленьком фрагменте:

  1. Если вы имеете дело со списком каталогов, и куча файлов (с заранее неизвестными именами ), не используйте fдля представления имени каталога. Это слишком запутанно.
  2. Когда вы имеете дело только с переменной оболочки, изолированно (, не связанный ни с чем другим ), просто, без изменений (, например, ##, %, :или /), вам не нужны фигурные скобки. См. Когда я должен назначать двойные кавычки вокруг переменных, таких как "${var}"для предотвращения проблем?

    Итак, я предлагаю, чтобы внешний цикл выглядел так:

    for d in 
    do
        cd "$d"
        (Code to execute in each directory)
        cd..
    done

В дополнение к прекрасному ответу @Eric Renouf, существует несколько способов написать код(для выполнения в каждом каталоге). Вот простой, близкий к тому, что вы пробовали:

for f in *.txt
do
    if [ -e "$f" ]
    then
        mv -- "$f" "${PWD##*/}".txt
    fi
done

Если есть один .txtфайл в каталоге, то это будет делать то, что вы хотите и ожидаете :цикл for f …выполняется один раз, где $fсоответствует имени файла, и файл будет переименован. (Я использую mv --для защиты от файлов чьи имена начинаются с-и в противном случае интерпретировались бы как опции. mv./"$f" …наверное тоже будет безопасно, пока вы уверены, что $f— это файл в текущем каталоге, или является относительным путем. )Если в каталоге нет файлов *.txt, то кроме того, цикл будет выполняться один раз, где $fравно (буквально )до *.txt. Поскольку файла с таким именем нет, тест -eне пройдет. и mvне будет выполнено.

Возникает проблема, если в каталоге несколько текстовых файлов. Если таких файлов n , то цикл будет выполняться n раз, и каждый текстовый файл будет переименован в "${PWD##*/}".txt. Как указал Закари Брейди , это может привести к тому, что последний файл перезапишет первые n −1 файлов. Один из способов исправить это — добавить параметр -iк команде mv. поэтому вы будете предупреждены о любой попытке перезаписать существующий файл, и предоставляется возможность одобрить его или отклонить. Это, конечно, бесполезно, если сценарий работает как задание cron. Другой подход заключается в добавлении команды breakв цикл :

.

for f in *.txt
do
    if [ -e "$f" ]
    then
        mv -- "$f" "${PWD##*/}".txt
        break
    fi
done

Это заставит цикл выполниться ровно один раз, т.е. потому что, когда он запускается, он выполняет команду break, что завершает цикл. Таким образом, будет переименован только первый текстовый файл, а любые другие останутся в покое. Вы не будете уведомлены о наличии нескольких файлов.

Чуть более сложный подход для обнаружения и обработки нескольких файлов:

first=1
for f in *.txt
do
    if [ -e "$f" ]
    then
        if [ "$first" ]
        then
            mv -- "$f" "${PWD##*/}".txt
            first=
        else
            printf "Warning: file %s not renamed.\n" "$f"
        fi
    fi
done

, в котором флаг firstустановлен в начале цикла, а затем очищается во время первой итерации, чтобы последующие итерации знали, что они не первые. В качестве альтернативы вы можете проверить, существует ли уже "${PWD##*/}".txt.

1
20.09.2019, 22:08
1 ответ

Оказывается, темы xfwm4 -были удалены из buster, потому что они больше не поддерживаются основной . Я загрузил и установил.deb со своего стрейч-машины, и пока он работает. Я предполагаю, что я рискую какой-то проблемой совместимости, когда xfce выходит на новую версию, но пока я буду жить с этим.

3
27.01.2020, 23:30

Теги

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