Как я могу переместить файл в другую папку, но только если он не изменялся 10 минут?

TL;DR:Используйте следующий скрипт, чтобы очистить ваши $XDG_DATA_HOME/ $HOMEот левых -оверов и размонтировать предыдущиеunionfs:

#!/bin/sh
set -eu

echo "Killing currently running Dwarf Fortress instances"
killall -q -9 Dwarf_Fortress || true

echo "Removing old Dwarf Fortress unionfs mounts and mount points"
find /tmp/ -maxdepth 1 -name "dwarf-fortress*" \
  -printf "  Found %f\n" \
  \( -exec fusermount -u {} \; -o -true \) \
  -exec rmdir {} \;


UNIONFSDIR="${XDG_DATA_HOME:-"${HOME:?}/.local/share/"}dwarf-fortress/run/.unionfs-fuse"

if [ -d "$UNIONFSDIR" ]; then
  echo "Removing old.unionfs-fuse directory"
  rm -r -- "$UNIONFSDIR"
fi
echo "Done. Run dwarf-fortress and praise Armok!"

Почему это происходит?

Пакет dwarf-fortress, предоставляемый Ubuntu, использует оболочку Python /usr/games/dwarf-fortress. Эта оболочка создает вторичную иерархию dataв $XDG_DATA_HOME/.local/share/dwarf-fortress/run/.unionfs-fuse, которая монтируется как unionfs(8)вместе с некоторыми другими каталогами.

Это позволяет вам размещать свои моды в каталоге $XDG_DATA_HOME/.local/share/dwarf-fortress, поэтому вам не нужно менять содержимое каталога /usr/share/games/dwarf-fortress, и это здорово! Однако с unionfsследует обращаться осторожно и правильно очищать его. Сценарий Python не смог этого сделать, когда вы использовали C -c , чтобы выйти из игры.

Таким образом, unionfs, вероятно, все еще установлен, но в плохом состоянии.

Как это исправить?

Итак, прежде всего, убедитесь, что игра полностью закрыта:

killall -s KILL Dwarf_Fortress

Затем убедитесь, что ничего не осталось unionfsКрепление пеленгатора:

mount | grep -a -e dwarf -e unionfs
unionfs on /tmp/dwarf-fortresswvlaptrarun type fuse.unionfs (rw,nosuid,nodev,relatime,user_id=1000,group_id=1000)
unionfs on /tmp/dwarf-fortress4ylv2t19run type fuse.unionfs (rw,nosuid,nodev,relatime,user_id=1000,group_id=1000)

Как видите, в настоящее время в моей системе их два. Поскольку оба сломаны, давайте избавимся от них с помощьюfusermount -u:

fusermount -u /tmp/dwarf-fortresswvlaptrarun 
fusermount -u /tmp/dwarf-fortress4ylv2t19run 

И последнее, но самое важное, удалите .unionfs-fuseв $XDG_DATA_HOME/dwarf-fortress/run/. У меня нет набора XDG_DATA_HOME, поэтому я должен использовать $HOME. Проверьте env, прежде чем случайно удалить не тот каталог!

rm -r $HOME/.local/share/dwarf-fortress/run/.unionfs-fuse

Вот именно. Обратите внимание, что версия df_linuxот Bay 12 Games не сталкивается с этой проблемой, так как не использует ни Python-оболочку, ни Unionfs.

При этом проблема была исправлена ​​в 2019 году и отправлена ​​по адресу bullseye. К сожалению, не исправлено в 0.44.12-1, поэтому busterвсе еще может быть затронуто.

Как вы пришли к такому решению?

В первую очередь я посмотрел на file $(which dwarf-fortress),который сказал мне, что это скрипт Python:

$ file $(which dwarf-fortress)
/usr/games/dwarf-fortress: Python script, ASCII text executable

Затем я проверил скрипт в любом редакторе и нашел

def get_user_run_dir():
    old_run_dir = xdg.BaseDirectory.save_data_path('dwarf-fortress')
    new_run_dir = os.path.join(old_run_dir, 'run')
    
   ...

def run_df_in_unionfs(user_run_dir, data_dirs, args):
    mnt_dirs = user_run_dir + "=rw:" + ':'.join(data_dirs)
    with tempfile.TemporaryDirectory(suffix='run', prefix='dwarf-fortress') as tmp_dir:
        cmd = ['unionfs', '-o', 'cow,relaxed_permissions', mnt_dirs, tmp_dir]
        subprocess.run(cmd).check_returncode()
        try:
            run_df(tmp_dir, args)
        finally:
            subprocess.run(['fusermount', '-u', tmp_dir]).check_returncode()

, который показал, что по крайней мере что-то можно найти в xdg.BaseDirectory, то есть $HOME/.local/share(, если не указано иное ). В то же время fusermount -uпоказывает, что после того, как мы вышли из Dwarf Fortress, ожидается отключение от маунта, а mount | grep unionfsподтверждает наличие активных маунтов в /tmp. Я избавился от всего каталога $XDG_DATA_HOME/dwarf-fortress, и он снова заработал. С помощью strace -ff -e trace=execve dwarf-fortressя смог подтвердить монтирование unionfsи нашел каталог .unionfs-fuse.

0
03.06.2021, 17:52
2 ответа

Однострочная команда здесь:

find /path/to/dir1 -type f ! -mmin -10 -exec mv {} /path/to/dir2 \;

Замените -10на что хотите, правило:

+n     for greater than n,
-n     for less than n,
n      for exactly n.
3
28.07.2021, 11:27

Есть много способов.

Использование поиска:

if find some_directory -mmin +10 | grep "^filename$" ; then
    mv filename somewhere_else
fi

Другим способом было бы вычислить md5sum и сравнить это

touch.filename.md5

prev_md5=$(cat.filename.md5)
new_md5=$(md5sum filename)

if [ "$prev_md5" = "$new_md5" ] ; then
    mv filename somewhere_else
fi
echo "$new_md5" >.filename.md5

и запускайте его каждые 10 минут.

1
28.07.2021, 11:27

Теги

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