Запишите имя корневого каталога путь к файлу его расширение д архив

Обновлено: 06.07.2024

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

Если указать «-» в качестве пути, borg прочитает данные из стандартного ввода и создаст файл «stdin» в созданном архиве из этих данных. Однако в некоторых случаях более уместно использовать –content-from-command. Подробности см. в разделе Чтение со стандартного ввода ниже.

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

В названии архива можно использовать следующие заполнители: , , , и некоторые другие.

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

Это сравнение может работать в разных режимах, заданных параметром --files-cache :

  • ctime,size,inode (по умолчанию)
  • mtime,size,inode (поведение по умолчанию для версий borg старше 1.1.0rc4)
  • ctime,size (игнорировать номер инода)
  • mtime,size (игнорировать номер инода)
  • rechunk,ctime (все файлы считаются измененными - rechunk, cache ctime)
  • rechunk,mtime (все файлы считаются измененными - rechunk, cache mtime)
  • отключено (отключить кеширование файлов, все файлы считаются измененными - перекомпоновать)

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

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

ctime vs. mtime: безопасность vs скорость

  • ctime — это довольно безопасный способ обнаружения изменений в файле (метаданные и содержимое), поскольку его нельзя установить из пользовательского пространства. Но изменение только метаданных уже обновит ctime, поэтому может быть ненужное разбиение/хэширование даже без изменений содержимого. Некоторые файловые системы не поддерживают ctime (время изменения). Например. выполнение chown или chmod для файла изменит его ctime.
  • mtime обычно работает и обновляется только в том случае, если содержимое файла было изменено. Но mtime можно произвольно установить из пользовательского пространства, например. чтобы вернуть mtime к тому же значению, которое было до изменения содержимого. Это может использоваться как злонамеренно, так и из лучших побуждений, но в обоих случаях режимы кэширования на основе mtime могут быть проблематичными.

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

Опция --progress показывает (слева направо) Исходный, Сжатый и Дедуплицированный (O, C и D соответственно), затем Количество файлов (N), обработанных на данный момент, а затем текущий обрабатываемый путь.< /p>

При использовании --stats вы получите некоторую статистику о том, сколько данных было добавлено — дедуплицированный размер «Этот архив» наиболее интересен, так как именно на него будет расти ваш репозиторий. Обратите внимание, что статистика «Все архивы» относится к состоянию после создания. Кроме того, параметры --stats и --dry-run являются взаимоисключающими, поскольку данные фактически не сжимаются и не дедуплицируются во время пробного запуска.

Дополнительную информацию о шаблонах включения/исключения см. в выводе команды borg help pattern.

Дополнительную справку по заполнителям см. в выводе команды borg help placeholders.

Шаблоны --exclude не похожи на tar. В tar --exclude .bundler/gems исключит foo/.bundler/gems. В борге этого не будет, вам нужно использовать --exclude ‘*/.bundler/gems’, чтобы получить тот же эффект.

Помимо использования шаблонов --exclude, можно использовать --exclude-if-present, чтобы указать имя объекта файловой системы (например, имя файла или папки), которое, если оно содержится в другой папке, предотвратит содержащую папку от резервного копирования. По умолчанию содержащаяся папка и все ее содержимое будут исключены из резервной копии. Однако, если вы хотите включить в резервную копию только объекты, указанные --exclude-if-present, и не включать какое-либо другое содержимое содержащей папки, это можно включить с помощью параметра --keep-exclude-tags. .

Опция -x или --one-file-system исключает каталоги, являющиеся точками монтирования (и все, что в них находится). Он обнаруживает точки монтирования, сравнивая номер устройства из вывода stat() каталога и его родительского каталога. В частности, он исключает каталоги, для которых stat() сообщает номер устройства, отличный от номера устройства их родителя. Имейте в виду, что в Linux (и, возможно, где-либо еще) есть каталоги с номером устройства, отличным от их родителя, которые ядро ​​​​не считает точкой монтирования, а также наоборот. Примерами являются связывание монтирования (возможно, с одним и тем же номером устройства, но всегда с точкой монтирования) и ВСЕ подтома btrfs (номер устройства отличается от родительского, но не обязательно точка монтирования). Поэтому при использовании --one-file-system следует вдвойне убедиться, что резервное копирование работает должным образом, особенно при использовании btrfs. Это еще более важно, если макет btrfs был создан кем-то другим, например. установщик дистрибутива.

Флаги элемента¶

--list выводит список всех файлов, каталогов и других элементов файловой системы, которые он рассмотрел (независимо от того, было ли в них изменено содержимое или нет). Перед каждым элементом ставится однобуквенный флаг, указывающий тип и/или статус элемента.

Если вас интересует только подмножество этого вывода, вы можете указать, например. --filter=AME, и будут отображаться только обычные файлы со статусом A, M или E (см. ниже).

Символ верхнего регистра обозначает статус обычного файла относительно кеша «файлов» (не относительно репозитория — это проблема, если кеш файлов не используется). Метаданные сохраняются в любом случае, а для «A» и «M» также сохраняются новые фрагменты данных. Для «U» все фрагменты данных относятся к уже существующим фрагментам.

  • «A» = обычный файл, добавленный (см. также «Я вижу статус «A» (добавленный) для неизмененного файла!? в разделе часто задаваемых вопросов)
  • 'M' = обычный файл, измененный
  • «U» = обычный файл без изменений
  • «C» = обычный файл, он изменился, пока мы создавали его резервную копию.
  • 'E' = обычный файл, произошла ошибка при доступе/чтении этого файла

Символ нижнего регистра означает тип файла, отличный от обычного файла, borg обычно просто хранит свои метаданные:

  • ‘d’ = каталог
  • ‘b’ = заблокировать устройство
  • 'c' = символьное устройство
  • 'h' = обычный файл, жесткая ссылка (на уже видимые индексные дескрипторы)
  • ‘s’ = символическая ссылка
  • 'f' = fifo

Другие используемые флаги включают:

  • 'i' = данные резервной копии были прочитаны из стандартного ввода (stdin)
  • '-' = пробный запуск, элемент не заархивирован
  • ‘x’ = исключено, элемент не заархивирован
  • '?' = отсутствует код состояния (если вы видите это, отправьте отчет об ошибке!)

Чтение со стандартного ввода¶

Существует два метода чтения из стандартного ввода. Либо укажите - как путь и канал прямо к боргу:

Или используйте --content-from-command, чтобы Борг управлял выполнением команды и конвейером. В этом случае первый аргумент PATH интерпретируется как команда для выполнения, а все последующие аргументы рассматриваются как аргументы команды:

-- используется для того, чтобы --id и --stdout не считались аргументами для borg, а скорее для backup-vm .

Разница между этими двумя подходами заключается в том, что при передаче в borg создается архив, даже если команда при передаче в borg завершается с ошибкой. В этом случае можно получить резервную копию усеченного вывода. Напротив, при использовании --content-from-command borg гарантированно завершится ошибкой без создания архива в случае сбоя команды. Команда считается неудачной, если она вернула ненулевой код выхода.

Чтение со стандартного ввода дает просто поток данных без связанных с ним файловых метаданных, а кеш файлов вообще не нужен. Поэтому безопасно отключить его с помощью --files-cache disabled и немного ускорить создание резервной копии.

По умолчанию содержимое, прочитанное со стандартного ввода, сохраняется в файле с именем «stdin». Используйте --stdin-name, чтобы изменить имя.

Получает элементы и дочерние элементы в одном или нескольких указанных местоположениях.

Синтаксис

Описание

Командлет Get-ChildItem получает элементы в одном или нескольких указанных расположениях. Если элемент является контейнером, он получает элементы внутри контейнера, называемые дочерними элементами. Вы можете использовать параметр Recurse, чтобы получить элементы во всех дочерних контейнерах, и использовать параметр Depth, чтобы ограничить количество уровней для рекурсии.

Get-ChildItem не отображает пустые каталоги. Если команда Get-ChildItem включает параметры Depth или Recurse, пустые каталоги не включаются в выходные данные.

Расположения предоставляются Get-ChildItem поставщиками PowerShell. Местоположение может быть каталогом файловой системы, кустом реестра или хранилищем сертификатов. Дополнительные сведения см. в разделе about_Providers.

Примеры

Пример 1. Получение дочерних элементов из каталога файловой системы

В этом примере дочерние элементы извлекаются из каталога файловой системы.Отображаются имена файлов и подкаталогов. Для пустых местоположений команда не возвращает никаких выходных данных и возвращается к командной строке PowerShell.

Командлет Get-ChildItem использует параметр Path для указания каталога C:\Test . Командлет Get-ChildItem отображает файлы и каталоги в консоли PowerShell.

По умолчанию Get-ChildItem перечисляет режим (атрибуты), LastWriteTime, размер файла (длина) и имя элемента. Буквы в свойстве Mode можно интерпретировать следующим образом:

  • л (ссылка)
  • d (каталог)
  • а (архив)
  • r (только для чтения)
  • ч (скрыто)
  • s (система).

Дополнительную информацию о флагах режима см. в разделе about_Filesystem_Provider.

Пример 2. Получение имен дочерних элементов в каталоге

В этом примере перечислены только имена элементов в каталоге.

Командлет Get-ChildItem использует параметр Path для указания каталога C:\Test . Параметр Name возвращает только имена файлов или каталогов по указанному пути.

Пример 3. Получение дочерних элементов в текущем каталоге и подкаталогах

В этом примере отображаются файлы .txt, расположенные в текущем каталоге и его подкаталогах.

Командлет Get-ChildItem использует параметр Path для указания C:\Test\*.txt . Путь использует подстановочный знак звездочки ( * ) для указания всех файлов с расширением имени файла .txt . Параметр Recurse ищет в каталоге Path его подкаталоги, как показано в заголовках Directory:. Параметр Force отображает скрытые файлы, такие как hiddenfile.txt, которые имеют режим h.

Пример 4. Получение дочерних элементов с помощью параметра Include

В этом примере командлет Get-ChildItem использует параметр Include для поиска определенных элементов в каталоге, указанном параметром Path.

Командлет Get-ChildItem использует параметр Path для указания каталога C:\Test. Параметр Path включает завершающую звездочку ( * ) для указания содержимого каталога. Параметр Include использует подстановочный знак звездочки ( * ) для указания всех файлов с расширением имени файла .txt.

При использовании параметра Include параметру Path требуется завершающая звездочка ( * ) для указания содержимого каталога. Например, -Путь C:\Test\* .

  • Если в команду добавлен параметр Recurse, завершающая звездочка ( * ) в параметре Path необязательна. Параметр Recurse получает элементы из каталога Path и его подкаталогов. Например, -Путь C:\Test\ -Recurse -Include *.txt
  • Если в параметре Path не указана завершающая звездочка ( * ), команда не возвращает никаких выходных данных и возвращается к командной строке PowerShell. Например, -Путь C:\Test\ .

Пример 5. Получение дочерних элементов с помощью параметра Exclude

Вывод примера показывает содержимое каталога C:\Test\Logs. Результат является ссылкой для других команд, использующих параметры Exclude и Recurse.

Командлет Get-ChildItem использует параметр Path для указания каталога C:\Test\Logs . Параметр Exclude использует подстановочный знак звездочки ( * ), чтобы указать, что любые файлы или каталоги, начинающиеся с A или a, исключаются из выходных данных.

При использовании параметра Exclude звездочка ( * ) в конце параметра Path необязательна. Например, -Path C:\Test\Logs или -Path C:\Test\Logs\* .

  • Если в параметре "Путь" отсутствует завершающая звездочка ( * ), отображается содержимое параметра "Путь". Исключениями являются имена файлов или подкаталогов, соответствующие значению параметра Exclude.
  • Если в параметре "Путь" указана завершающая звездочка ( * ), команда рекурсивно переходит в подкаталоги параметра "Путь". Исключениями являются имена файлов или подкаталогов, соответствующие значению параметра Exclude.
  • Если в команду добавлен параметр Recurse, выходные данные рекурсии будут одинаковыми независимо от того, содержит ли параметр Path завершающую звездочку ( * ).

Пример 6. Получение ключей реестра из куста реестра

В этом примере все ключи реестра извлекаются из HKEY_LOCAL_MACHINE\HARDWARE .

Командлет Get-ChildItem использует параметр Path для указания раздела реестра HKLM:\HARDWARE . Путь к кусту и ключи реестра верхнего уровня отображаются в консоли PowerShell.

Первая команда показывает содержимое раздела реестра HKLM:\HARDWARE. Параметр Exclude указывает командлету Get-ChildItem не возвращать подразделы, начинающиеся с D* . В настоящее время параметр Exclude работает только с подразделами, но не со свойствами элемента.

Пример 7. Получение всех сертификатов с правом подписи кода

В этом примере получаются все сертификаты на диске PowerShell Cert: с полномочиями на подпись кода.

Командлет Get-ChildItem использует параметр Path для указания поставщика Cert:. Параметр Recurse выполняет поиск в каталоге, указанном параметром Path, и его подкаталогах.Параметр CodeSigningCert получает только сертификаты с полномочиями на подпись кода.

Дополнительную информацию о поставщике сертификатов и диске Cert: см. в разделе about_Certificate_Provider.

Пример 8. Получение элементов с помощью параметра "Глубина"

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

Командлет Get-ChildItem использует параметр Path для указания C:\Parent. Параметр Depth задает два уровня рекурсии. Командлет Get-ChildItem отображает содержимое каталога, указанного параметром Path, и два уровня подкаталогов.

Пример 9. Получение информации о жестких ссылках

В PowerShell 6.2 добавлено альтернативное представление для получения информации о жестких ссылках.

Пример 10. Вывод для операционных систем, отличных от Windows

В PowerShell 7.1 в системах Unix Get-ChildItem обеспечивает выходные данные, подобные Unix:

  • UnixMode — это права доступа к файлам, представленные в системе Unix.
  • Пользователь является владельцем файла
  • Группа является владельцем группы
  • Размер – это размер файла или каталога, представленный в системе Unix.

Эта функция была перемещена из экспериментальной в основную в PowerShell 7.1.

Пример 11. Получение цели ссылки для точки соединения

Команда dir в командной оболочке Windows показывает целевое расположение точки соединения файловой системы. В PowerShell эта информация доступна из свойства LinkTarget объекта файловой системы, возвращаемого командлетом Get-ChildItem, и отображается в выходных данных по умолчанию.

Параметры

Получает файлы и папки с указанными атрибутами. Этот параметр поддерживает все атрибуты и позволяет указывать сложные комбинации атрибутов.

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

Get-ChildItem -Attributes !Directory+!System+Encrypted, !Directory+!System+Compressed

Чтобы найти файлы и папки с часто используемыми атрибутами, используйте параметр Атрибуты. Или параметры Каталог, Файл, Скрытый, Только для чтения и Система.

Параметр Attributes поддерживает следующие свойства:

Описание этих атрибутов см. в перечислении FileAttributes.

Чтобы объединить атрибуты, используйте следующие операторы:

Не используйте пробелы между оператором и его атрибутом. Пробелы допускаются после запятых.

Для общих атрибутов используйте следующие сокращения:

  • D (Каталог)
  • H (скрыто)
  • R (только чтение)
  • S (Система)

Этот параметр был добавлен в PowerShell 5.0 и позволяет управлять глубиной рекурсии. По умолчанию Get-ChildItem отображает содержимое родительского каталога. Параметр Depth определяет количество уровней подкаталогов, включенных в рекурсию, и отображает содержимое.

Например, глубина 2 включает каталог параметра "Путь", первый уровень подкаталогов и второй уровень подкаталогов. По умолчанию в вывод включаются имена каталогов и файлов.

Тип:UInt32
Позиция:Имя
Значение по умолчанию:Нет
Принять ввод конвейера:False
Допускать подстановочные знаки:False

Чтобы получить список каталогов, используйте параметр "Каталог" или параметр "Атрибуты" со свойством "Каталог". Вы можете использовать параметр Recurse с каталогом.

< /tr>

Указывает массив из одного или нескольких строковых шаблонов, которые должны сопоставляться при получении командлетом дочерних элементов. Любой соответствующий элемент исключается из вывода. Введите элемент пути или шаблон, например *.txt или A* . Допускаются подстановочные знаки.

Звездочка ( * ) в конце параметра Path необязательна. Например, -Path C:\Test\Logs или -Path C:\Test\Logs\* . Если включена завершающая звездочка ( * ), команда рекурсивно переходит в подкаталоги параметра Path. Без звездочки ( * ) отображается содержимое параметра Path. Более подробная информация содержится в примере 5 и в разделе "Примечания".

Параметры Include и Exclude можно использовать вместе. Однако исключения применяются после включений, что может повлиять на конечный результат.

Тип:SwitchParameter
Псевдонимы:ad
Позиция:Имя
Значение по умолчанию:Нет
Принимать ввод конвейера:False
Допускать подстановочные знаки:False
Тип:Строка [ ]
Позиция:Название
Значение по умолчанию:Нет
Принять ввод конвейера:False< /td>
Допускать подстановочные знаки:True

Чтобы получить список файлов, используйте параметр File. Вы можете использовать параметр Recurse с файлом.

< /tr>

Тип:SwitchParameter
Псевдонимы:af
Позиция:Имя
Значение по умолчанию:Нет
Принимать ввод конвейера:False
Допускать подстановочные знаки:False
Тип:Строка
Позиция:1
Значение по умолчанию:Нет
Принять ввод конвейера:False
Допускать подстановочные знаки:True

По умолчанию командлет Get-ChildItem отображает символические ссылки на каталоги, найденные во время рекурсии, но не выполняет рекурсию в них. Используйте параметр FollowSymlink для поиска каталогов, предназначенных для этих символических ссылок. FollowSymlink — это динамический параметр, который поддерживается только поставщиком файловой системы.

Этот параметр появился в PowerShell 6.0.

Тип:SwitchParameter
Позиция:Именованный
Значение по умолчанию:Нет
Принять ввод конвейера:False
Допускать подстановочные знаки:False

Позволяет командлету получать элементы, к которым пользователь иначе не может получить доступ, например скрытые или системные файлы. Параметр Force не отменяет ограничения безопасности. Реализация варьируется среди поставщиков. Дополнительные сведения см. в разделе about_Providers.

Тип:SwitchParameter
Позиция:Именованный
Значение по умолчанию:False
Принять ввод конвейера:False
Допускать подстановочные знаки:False

Чтобы получить только скрытые элементы, используйте параметр Hidden или параметр Attributes со свойством Hidden. По умолчанию Get-ChildItem не отображает скрытые элементы. Используйте параметр Force, чтобы получить скрытые элементы.

Тип:SwitchParameter
Псевдонимы:ah, h
Позиция:Имя
Значение по умолчанию:Нет
Принимать ввод конвейера:False
Допускать подстановочные знаки:False< /td>

Указывает массив из одного или нескольких строковых шаблонов, которые должны сопоставляться при получении командлетом дочерних элементов. Любой соответствующий элемент включается в вывод. Введите элемент пути или шаблон, например "*.txt" . Подстановочные знаки разрешены. Параметр Include действует, только если команда включает содержимое элемента, например C:\Windows\* , где подстановочный знак указывает содержимое каталога C:\Windows.

Параметры Include и Exclude можно использовать вместе. Однако исключения применяются после включений, что может повлиять на конечный результат.

Тип:Строка [ ]
Позиция:Название
Значение по умолчанию:Нет
Принять ввод конвейера:False< /td>
Допускать подстановочные знаки:True

Указывает путь к одному или нескольким расположениям. Значение LiteralPath используется точно так, как оно введено. Никакие символы не интерпретируются как подстановочные знаки. Если путь содержит escape-символы, заключите его в одинарные кавычки. Одиночные кавычки сообщают PowerShell, что никакие символы не должны интерпретироваться как управляющие последовательности.

Тип:String [ ]
Псевдонимы:PSPath, LP
Позиция:Имя
Значение по умолчанию:Нет< /td>
Принимать ввод конвейера:True
Допускать подстановочные знаки: Ложь

Получает только названия элементов в местоположении. Результатом является строковый объект, который можно отправить по конвейеру другим командам. Подстановочные знаки разрешены.

Тип:SwitchParameter
Позиция:Именованный
Значение по умолчанию:Нет
Принять ввод конвейера:False
Допускать подстановочные знаки:True

Указывает путь к одному или нескольким местоположениям. Подстановочные знаки принимаются. Расположение по умолчанию — текущий каталог ( . ).

Тип:Строка [ ]
Позиция:0
Значение по умолчанию:Текущий каталог
Принять ввод конвейера:True
Допускать подстановочные знаки:Истина

Чтобы получить элементы только для чтения, используйте параметр ReadOnly или свойство ReadOnly параметра Attributes.

< /tr>

Получает элементы в указанных местоположениях и во всех дочерних элементах местоположений.

Тип:SwitchParameter
Псевдонимы:ar
Позиция:Имя
Значение по умолчанию:Нет
Принимать ввод конвейера:False
Допускать подстановочные знаки:False
< /tr>

Получает только системные файлы и каталоги. Чтобы получить только системные файлы и папки, используйте системное свойство параметра System или Attributes.

Тип:SwitchParameter
Псевдонимы:s
Позиция:Имя
Значение по умолчанию:False
Принимать ввод конвейера:False
Допускать подстановочные знаки:False
< /tr>

Входные данные

Вы можете передать строку, содержащую путь к Get-ChildItem .

Результаты

Тип объекта, который возвращает Get-ChildItem, определяется объектами в пути к диску поставщика.

Если вы используете параметр Name, Get-ChildItem возвращает имена объектов в виде строк.

Имена файлов Windows состоят из двух частей. имя файла, затем точка, за которой следует расширение (суффикс). Расширение представляет собой трех- или четырехбуквенную аббревиатуру, обозначающую тип файла. Например, в файле letter.docx имя файла — буква, а расширение — docx. Расширения важны, потому что они сообщают вашему компьютеру, какой значок использовать для файла и какое приложение может открыть файл. Например, расширение doc сообщает вашему компьютеру, что файл является файлом Microsoft Word.

Если вы хотите открыть файл MAC OS X в Windows, вам может потребоваться добавить расширение к имени файла MAC OS X, чтобы Windows могла его распознать. Например, если у вас есть документ Word 6 MAC OS X с именем letter, который вы хотите открыть в Windows, вам нужно переименовать файл letter.docx, чтобы Word в Windows распознал и открыл этот файл.

Примечание. Этот список ни в коем случае не является полным и исчерпывающим списком расширений файлов. Если используемое вами расширение файла отсутствует в списке ниже, вы можете найти информацию в руководстве по программному обеспечению или на веб-сайте программного обеспечения.

Примечание. Если ни у одного из ваших имен файлов нет расширений, расширения файлов будут скрыты. См. Отображение расширений файлов

Отображение расширений файлов

Если ни одно из ваших имен файлов не имеет расширений, расширения файлов скрыты. Чтобы показать расширения файлов:

<р>1. В Проводнике откройте вкладку "Вид" и установите флажок рядом с "Расширения имен файлов".


<р>1. Нажмите на меню "Пуск" и введите "Показать скрытые файлы и папки", затем нажмите клавишу ввода или выберите этот параметр в списке результатов.



Поиск расширений файлов

Иногда может потребоваться выполнить поиск всех файлов определенного типа. Например, вы можете найти файл .pst или файл .mp3 на своем компьютере. Выполните следующие действия, чтобы найти расширение файла.


<р>1. Щелкните меню «Пуск» или строку поиска и введите «*», а затем расширение файла, который вы хотите найти (например, *.jpg), и нажмите клавишу «Ввод».

Мне нужен способ разбить эти входные данные, в частности, на .txt для расширения. Есть ли встроенный способ сделать это в Java? Я бы не хотел писать свой собственный синтаксический анализатор.

Никогда не знаешь, когда появится новая платформа, в которой расширения будут разделены запятой. Теперь вам нужно написать зависящий от платформы код. Платформы Java должны быть более дальновидными и иметь API для получения расширений, где они пишут код, зависящий от платформы, а вы, как пользователь API, просто говорите, получите расширение.

@EricDuminil "Обязательно не применяйте методы, которые возвращают "txt" из "filename.txt"" . Попробуйте path.substring(path.lastIndexOf(".")); . И да..Они точно ничего не дублируют просто так.

@VelocityPulse Это именно меня беспокоит. Поскольку не существует стандартного способа получить расширение файла, вы получаете десятки полунеправильных ответов и несколько отличающихся реализаций. В вашем коде используются 2 метода (мне бы хотелось иметь один единственный явный метод), он возвращает ".txt" из "filename.txt" , что может быть нежелательным результатом, и худший из все, он завершается с ошибкой StringIndexOutOfBoundsException вместо того, чтобы возвращать пустую строку, если нет расширения.

31 Ответ 31

Вот пример того, как его использовать (вы можете указать либо полный путь, либо просто имя файла):

Gradle Groovy DSL

Gradle Kotlin DSL


@zhelon .gz означает сжатый файл gnu, а .tar означает (t)ape (ar)chive. Таким образом, .tar.gz — это tar-файл внутри сжатого gnu файла с расширением .gz.

@guru_001 Нет, конечно, это не так, я просто упомянул, что вы можете вызывать его как с полным путем, так и просто с именем файла.

Действительно ли для этого нужен «парсер»?

Предположим, что вы имеете дело с простыми именами файлов в стиле Windows, а не с архивом.tar.gz .

Кстати, в случае, если у каталога может быть '.', а у самого имени файла нет (например, /path/to.a/file ), вы можете сделать

Как вы сказали, есть ряд вещей, о которых стоит подумать, помимо простого использования наивного lastIndexOf("."). Я предполагаю, что у Apache Commons есть для этого метод, учитывающий все маленькие каверзные потенциальные проблемы.

независимо от того, насколько простым является любой фрагмент кода. вам все еще нужно обновить его/поддерживать/протестировать/сделать доступным как удобную зависимость. гораздо проще, если бы все это уже делала библиотека

Следует отметить, что это возвращает '.' также, поэтому расширение вашего файла будет «.txt», а не «txt» в некоторых других ответах

Лучший ответ и @NickEntin Лучший комментарий. Чтобы удалить точку "." из расширения файла можно закодировать как int lastIndexOf = name.lastIndexOf(".") + 1;

@Iman Akbari: getName() возвращает только само имя файла, которое в вашем примере будет "httpconf".

Если вы используете библиотеку Guava, вы можете прибегнуть к служебному классу Files. У него есть специальный метод getFileExtension(). Например:

Кроме того, вы также можете получить имя файла с помощью аналогичной функции getNameWithoutExtension():


Правда? Это отличная библиотека, полная утилит. Большинство из них станут частью Java8, как и замечательная функция Guava.

К сожалению, не все люди могут решить, какие библиотеки использовать. По крайней мере, у нас есть Apache Commons, пусть и старый.

если вы видите исходный код getFileExtension, на самом деле это просто int dotIndex = fileName.lastIndexOf('.'); вернуть (dotIndex == -1)? "" : fileName.substring(dotIndex + 1) так что ничего страшного. также обратите внимание, что файлы по какой-то причине помечены как «нестабильные».

@Al-Mothafar многие классы помечены как нестабильные (см. сборщики мультикарт), я тоже не понимаю почему: было выпущено несколько релизов, но там ничего не изменилось.

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


Это проверенный метод


Чтобы учесть имена файлов без символов перед точкой, вы должны использовать это небольшое изменение принятого ответа:


если вам нужен только "txt", сделайте path.lastIndexOf(".") + 1


Если вы используете фреймворк Spring в своем проекте, вы можете использовать StringUtils


Мое грязное и, возможно, самое маленькое использование String.replaceAll:

Обратите внимание, что сначала * является жадным, поэтому он будет захватывать максимально возможное количество символов, а затем останется только последняя точка и расширение файла.

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

Как видно из всех других ответов, адекватной «встроенной» функции не существует. Это безопасный и простой метод.

Вот еще одна строчка для Java 8.

Это работает следующим образом:

  1. Разбить строку на массив строк с помощью "."
  2. Преобразовать массив в поток
  3. Используйте сокращение, чтобы получить последний элемент потока, то есть расширение файла.


Как насчет (используя Java 1.5 RegEx):

Если вы планируете использовать Apache commons-io и просто хотите проверить расширение файла, а затем выполнить какую-либо операцию, вы можете использовать это, вот фрагмент кода:

Как насчет JFileChooser? Это не так просто, так как вам нужно будет проанализировать его окончательный вывод.

который является типом MIME.

Хорошо. Я забыл, что вы не хотите знать его MIME-тип.

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

afterLastSlash создан для ускорения поиска afterLastBackslash, поскольку ему не нужно искать всю строку, если в ней есть косые черты.

Действительно "gz" является правильным расширением для возврата. Если вызывающий код также может обрабатывать «tar», то он должен дополнительно проверять, вне функции getExtension. Если имя файла пользователя «мой почтовый индекс. не трогайте.tar.gz», этот метод вернет неправильное расширение.

при запуске расширение должно содержать ".txt".

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


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

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


Как насчет версии REGEX:

или с нулевым расширением:

результат для *nix:
путь: /root/docs/
имя: readme
расширение: txt

для Windows, parsePath("c:\windows\readme.txt"):
путь: c:\windows\
имя: readme
Расширение: txt



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

(1) Вы должны использовать lastIndexOf, чтобы имена файлов, такие как john.smith.report.doc, обрабатывались правильно. (2) Вы должны правильно обрабатывать случаи, когда нет расширения. Этот метод возвращает ABC/XYZ для пути типа abc/xyz, что не имеет никакого смысла. Было бы разумнее вернуть "" или null . (3) Разделитель файлов не всегда / .

Получение расширения файла из имени файла

* Вывод будет одинаковым независимо от машины, на которой выполняется код. * * @param filename имя файла, для которого необходимо получить расширение. * @вернуть расширение файла или пустую строку, если таковой не существует. */ public static String getExtension(String filename) < if (filename == null) < return null; >int index = indexOfExtension(имя файла); если (индекс == -1) < вернуть ""; >else < return filename.substring(index + 1); >> /** * Возвращает индекс последнего символа-разделителя расширения, который является точкой. *

* Этот метод также проверяет отсутствие разделителя каталогов после последней точки. * Для этого он использует, который будет * обрабатывать файл в формате Unix или Windows. *

* Вывод будет одинаковым независимо от машины, на которой выполняется код. * * @param filename имя файла, в котором нужно найти последний разделитель пути, null возвращает -1 * @return индекс последнего символа-разделителя или -1, если * такого символа нет */ public static int indexOfExtension(String filename) < если (имя файла == ноль) < вернуть -1; >int extensionPos = имя файла.lastIndexOf(EXTENSION_SEPARATOR); int lastSeparator = indexOfLastSeparator(имя файла); return (lastSeparator > extensionPos ? -1 : extensionPos); > /** * Возвращает индекс последнего символа-разделителя каталогов. *

* Этот метод работает с файлами в формате Unix или Windows. * Возвращается позиция последней прямой или обратной косой черты. *

Читайте также:

Тип:SwitchParameter
Псевдонимы:as
Позиция:Имя
Значение по умолчанию:Нет
Принимать ввод конвейера:False
Допускать подстановочные знаки:False