Как мне выбрано файловые пути к файлу из текстового файла?

Согласитесь, что время изменения (также известное как ctime ) является наиболее переносимой функцией, которую можно наблюдать на * nix. файловая система, OP может потребоваться более подробная информация.

POSIX документирует три отметки времени для каждого файла, каталога, устройства в файловой системе: доступ , модификация и изменено . Первые два могут быть установлены в произвольные значения с помощью utimes (широко доступны, хотя и помечены как расширение), а последний - нет. Он обновляется до текущего времени как побочный эффект многих системных вызовов, включая utimes . Скорее всего, он чаще всего обновляется с помощью chmod , но это также происходит при перемещении или переименовании файла.

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

Программа find (также задокументированная в POSIX) включает параметр для использования ctime :

-ctime n
Первичный объект должен оцениваться как истинный, если время последнего изменения информации о статусе файла, вычтенное из времени инициализации, деленное на 86400 (с отброшенным остатком), составляет n .

86400 обозначает количество секунд в дне; n - целое число (количество дней). Некоторые реализации find предусматривают меньшие блоки, но их нет в POSIX.

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

find . -ctime -1 -print

Некоторые реализации могут допускать нецелочисленное значение для n , но POSIX здесь явно:

] В описаниях, где n используется в качестве основного аргумента, он должен интерпретироваться как десятичное целое число , которому может предшествовать знак плюса ('+') или минуса (' - ')

, поэтому невозможно иметь POSIX-совместимое расширение в этом направлении. Другие реализации могут предоставлять альтернативные параметры, которые (например) определяют разницу во времени как количество минут. Вам следует обратиться к руководству по find для используемой вами системы, чтобы узнать, применимо ли это к вам.

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

  • VMS (позже переименованную в OpenVMS ), с созданием , резервной копией , редакцией и отметки времени истечения .
  • Windows , с созданием , доступом и модификацией отметками времени (с учетом того, что, хотя имена схожи, правила обновления отличаются от POSIX).

Более уместное обсуждение содержится в Как получить дату создания файла в Linux? , где упоминается член st_birthtime для структуры stat .Это описано на страницах руководства для OSX stat (2) и FreeBSD stat (2) , а также в специфичном для системы FreeBSD stat (1) и OSX stat (1) утилиты. (NetBSD также документирует это расширение). Для краткости можно назвать это особенностью современных систем BSD.

Соответствующая утилита find также поддерживает расширение (см., Например, OSX find (1) ):

все -B * Первичные параметры, связанные со временем рождения , являются расширением IEEE Std 1003.1-2001 («POSIX.1»).

В других системах это расширение отсутствует. Для обсуждения:

  • Re: st_birthtime Эрика Блейка в списке рассылки Cygwin, где он комментирует тот факт, что Windows поддерживает это, но не POSIX.
  • Linux: Как узнать дату создания файла? сообщение scott утверждает, что есть некоторые файловые системы, которые поддерживают аналогичную функцию с другим именем.

1
07.09.2018, 07:12
4 ответа

Если все пути начинаются с /, вы можете просто сопоставить /, за которым следует последовательность символов, отличных от-":

$ grep -o '/[^"]*' file
/user/bin/share
/home/user/.local
/root/

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

awk '{gsub(/"/,"",$2); print $2}' file
6
27.01.2020, 23:11

Предполагая, что пути не содержат символов новой строки,

$ sed 's/^.*[[:blank:]]"//; s/"$//' <file
/user/bin/share
/home/user/.local
/root/

Код sedсначала удаляет все в каждой строке до первого символа "включительно, которому предшествует пробел (или табуляция ). Затем он удаляет "в конце.

Это позволяет путям содержать пробелы и встроенные символы ", но не комбинацию пробел+".

1
27.01.2020, 23:11

Почему бы простому

awk -F\" '{print $4}' file
/user/bin/share
/home/user/.local
/root/

работа?

1
27.01.2020, 23:11

Простой подход. Выделите поле #4 с кавычками в качестве разделителей, используя cut.

$ cut -f4 -d\" file
/user/bin/share
/home/user/.local
/root/
$
1
27.01.2020, 23:11

Теги

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