Сколько минуты передали с Эпохи Unix?

По имени

Можно генерировать список файлов в архиве и удалить их, хотя это раздражающе трудно с archivers те, которые разархивировали или 7z, которые не имеют опции генерировать простой список имен файлов. Даже с tar, это предполагает, что в именах файлов нет никаких новых строк.

tar tf foo.tar | while read -r file; do rm -- "$file" done
unzip -l foo.zip | awk '
    p && /^ --/ {p=2}
    p==1 {print substr($0, 29)}
    /^ --/ {++p}
' | while …
unzip -l foo.zip | tail -n +4 | head -n -2 | while …  # GNU coreutils only
7z l -slt foo.zip | sed -n 's/^Path = //p' | while …  # works on tar.*, zip, 7z and more

Вместо того, чтобы удалить файлы, Вы могли переместить их к их намеченному месту назначения.

tar tf foo.tar | while read -r file; do
  if [ -d "$file" ]; then continue; fi
  mkdir -p "/intended/destination/${file%/*}"
  mv -- "$file" "/intended/destination/$file"
done

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

Вместо в зависимости от внешних инструментов, Вы можете (на большинстве нельдов), используют FUSE для управления архивами с помощью обычных команд файловой системы.

Можно использовать zip Предохранителя, чтобы посмотреть в zip, извлечь ее с cp, перечислите его содержание с find, и т.д.

mkdir /tmp/foo.d
fuse-zip foo.zip /tmp/foo.d
## Remove the files that were extracted mistakenly (GNU/BSD find)
(cd /tmp/foo.d && find . \! -type d -print0) | xargs -0 rm
## Remove the files that were extracted mistakenly (zsh)
rm /tmp/foo.d/**(:"s~/tmp/foo.d/~~"^/)
## Extract the contents where you really want them
cp -Rp /tmp/foo.d /intended/destination
fusermount -u foo.d
rmdir foo.d

AVFS создает представление Вашей всей иерархии каталогов, где все архивы имеют связанный каталог (то же имя с #, прикрепляемым на в конце), который, кажется, содержит содержание архива.

mountavfs
## Remove the files that were extracted mistakenly (GNU/BSD find)
(cd ~/.avfs/"$PWD/foo.zip#" && find . \! -type d -print0) | xargs -0 rm
## Remove the files that were extracted mistakenly (zsh)
rm ~/.avfs/$PWD/foo.zip\#/**/*(:"s~$HOME/.avfs/$PWD/foo.zip#~~"^/)
## Extract the contents where you really want them
cp -Rp ~/.avfs/"$PWD/foo.zip#" /intended/destination
umountavfs

По дате

Принятие там не было другим никаким действием в той же иерархии, чем Ваше извлечение, можно сказать извлеченные файлы их недавним ctime. Если Вы просто создали или переместили zip-файл, можно использовать его в качестве сокращения; иначе используйте ls -lctr определить подходящее время сокращения. Если Вы хотите удостовериться, что не удалили zip, нет никакой причины сделать любое ручное одобрение: find совершенно способно к исключению их. Вот команды в качестве примера с помощью zsh или find; обратите внимание что -cmin и -cnewer основные устройства не находятся в POSIX, но существуют на Linux (и другие системы с GNU находят), *BSD и OSX.

find . \! -name '*.zip' -type f -cmin -5 -exec rm {} +  # extracted <5 min ago
rm **/*~*.zip(.cm-6)  # zsh, extracted ≤5 min ago
find . -type f -cnewer foo.zip -exec rm {} +  # created or moved after foo.zip

С GNU находят, FreeBSD и OSX, другой способ указать, что время сокращения должно создать файл и использование touch установить его mtime на время сокращения.

touch -d … cutoff
find . -type f -newercm cutoff -delete

Вместо того, чтобы удалить файлы, Вы могли переместить их к их намеченному месту назначения. Вот путь с GNU / *BSD/OSX, находят, создавая каталоги в месте назначения по мере необходимости.

find . \! -name . -cmin -5 -type f -exec sh -c '
    for x; do
      mkdir -p "$0/${x%/*}"
      mv "$x" "$0/$x"
    done
  ' /intended/destination {} +

Эквивалентный Zsh (почти: этот воспроизводит всю иерархию каталогов, не только каталоги, которые будут содержать файлы):

autoload zmv
mkdir -p ./**/*(/cm-3:s"|.|/intended/destination|")
zmv -Q '(**/)(*)(.cm-3)' /intended/destination/'$1$2'

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

3
15.12.2018, 23:53
3 ответа
#!/bin/bash

# Minutes since Epoch until now:
((minutes=$(date +%s)/60))

# Minutes since Epoch until Jan 1 2011:
((minutes=$(date -d 'Jan 1 2011' +%s)/60))
9
27.01.2020, 21:08
  • 1
    %s в date +%s расширение GNU. Другие реализации обычно позволяют те же строки формата как в strftime(3), которые главным образом не имеют %s. И ПОЧЕМУ все принимают bash доступность? –  MattBianco 31.03.2011, 09:41
  • 2
    Это принимает секунды прыжка во внимание? –  mattdm 31.03.2011, 18:51
  • 3
    @mattdm> От info date... %s "... Секунды прыжка не считаются, если прыжок вторая поддержка не доступен".... %S, "второй ('00'... 60'). Это может быть '60', если секунды прыжка поддерживаются".... Я могу только предположить, что это включало бы в те секунды в в общей сложности 'секундах начиная с эпохи', когда поддержка доступна. –  Peter.O 31.03.2011, 19:20
  • 4
    @mattbianco 1) я не обязательно "принимал" доступность удара. Я предоставил свое решение с помощью удара. Это не должно быть принято @patrick как ответ, и можно предоставить собственное решение. 2) При обсуждении Linux почти бесспорно, что удар доступен. Я поместил свое предположение приблизительно в 99,9%, вероятно, учитывая любой случайный выбор установок Linux. 3) я использую OSX и %s доступно в BSD's date даже при том, что в целом это значительно команда, чем GNU date. –  nix 01.04.2011, 17:53

Если Вам установили Python затем, можно выполнить это:

python -c "import time; print time.time() / 60"
3
27.01.2020, 21:08

Можно проверить интерактивную версию Эпохи Unix: Преобразователь Эпохи. Можно получить текущее значение Эпохи и также преобразовать время назад в эпоху

1
27.01.2020, 21:08

Теги

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