Как отсортировать файлы с помощью команды File на основе кодировок - PullRequest
0 голосов
/ 06 апреля 2020

Как я могу отсортировать эти файлы в разные файлы на основе кодировок?

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

AmericanDreamsS01E17_en.srt:                        Little-endian UTF-16 Unicode text, with CRLF line terminators
The_Last_Mimzy_en.srt:                              Non-ISO extended-ASCII text, with CRLF line terminators
Everybody_Hates_Chris_S04_E06_en.srt:               ISO-8859 text, with CRLF line terminators
Blackish_S01_E24_en.srt:                            OS/2 REXX batch file, UTF-8 Unicode (with BOM) text, with CRLF line terminators
Coyote_Ugly_en.srt:                                 Non-ISO extended-ASCII text, with CRLF line terminators
Coyote_Ugly_en.txt:                                 UTF-8 Unicode text, with very long lines, with no line terminators
Crash_en.srt:                                       UTF-8 Unicode (with BOM) text, with CRLF line terminators.
Weeds_S02E12_en.srt:                                C++ source, UTF-8 Unicode (with BOM) text, with CRLF line terminators
Weeds_S02E12_en.txt:                                UTF-8 Unicode text, with very long lines
WeWereSoldiers_en.srt:                              ASCII text, with CRLF line terminators
WeWereSoldiers_en.txt:                              UTF-8 Unicode text, with very long lines, with no line terminators
Without_A_Paddle_en.srt:                            UTF-8 Unicode (with BOM) text, with CRLF line terminators

Ответы [ 3 ]

0 голосов
/ 06 апреля 2020

Для этого вы можете использовать команду sort:

  -k, --key=KEYDEF
          sort via a key; KEYDEF gives location and type

Поэтому команда будет:

$ find . | sort -k 2
WeWereSoldiers_en.srt:                              ASCII text, with CRLF line terminators
Weeds_S02E12_en.srt:                                C++ source, UTF-8 Unicode (with BOM) text, with CRLF line terminators
Everybody_Hates_Chris_S04_E06_en.srt:               ISO-8859 text, with CRLF line terminators
AmericanDreamsS01E17_en.srt:                        Little-endian UTF-16 Unicode text, with CRLF line terminators
Coyote_Ugly_en.srt:                                 Non-ISO extended-ASCII text, with CRLF line terminators
The_Last_Mimzy_en.srt:                              Non-ISO extended-ASCII text, with CRLF line terminators
Blackish_S01_E24_en.srt:                            OS/2 REXX batch file, UTF-8 Unicode (with BOM) text, with CRLF line terminators
Weeds_S02E12_en.txt:                                UTF-8 Unicode text, with very long lines
Coyote_Ugly_en.txt:                                 UTF-8 Unicode text, with very long lines, with no line terminators
WeWereSoldiers_en.txt:                              UTF-8 Unicode text, with very long lines, with no line terminators
Crash_en.srt:                                       UTF-8 Unicode (with BOM) text, with CRLF line terminators.
Without_A_Paddle_en.srt:                            UTF-8 Unicode (with BOM) text, with CRLF line terminators
0 голосов
/ 06 апреля 2020

Если вы хотите переместить файлы в новый каталог в зависимости от типа файла, то этот скрипт поможет вам:

#!/usr/bin/ruby
require 'find'
require 'fileutils'

search_in='.'
files = []

Dir.mkdir search_in + '/arranged' unless File.exists? search_in + '/arranged'

arrange = {
     'ASCII text, with CRLF line terminators' => 'ASCIIWITHCRLF',
     'C++ source, UTF-8 Unicode (with BOM) text, with CRLF line terminators' => 'CPPUTF8',
     'ISO-8859 text, with CRLF line terminators' => 'ISO8859CRLF',
     'Little-endian UTF-16 Unicode text, with CRLF line terminators' => 'LEUTF16',
     'Non-ISO extended-ASCII text, with CRLF line terminators' => 'NONISOEXASCIICRLF',
     'OS/2 REXX batch file, UTF-8 Unicode (with BOM) text, with CRLF line terminators' => 'OS2REXXBATCHUTF8CRLF',
     'UTF-8 Unicode (with BOM) text, with CRLF line terminators' => 'UNICODEBOMUTF8CRLF',
     'UTF-8 Unicode text, with very long lines' => 'UNICODEUTF8LONGLINES',
     'UTF-8 Unicode text, with very long lines, with no line terminators' => 'UNICODEUTF8LONGLINESNOLT',
}


arrange.each do |key,value|
    FileUtils.mkdir_p search_in + '/arranged/' + value unless File.exists? search_in + '/arranged/' + value
end

Find.find(search_in) do |path|
  file_type = system('file -b ' + path)
  FileUtils.cp(path, search_in + '/arranged/' + arrange[file_type]) if arrange.key?(file_type)
end

Его Ruby. Удачи!

0 голосов
/ 06 апреля 2020

Из документации man file вам потребуется изменить команду file, чтобы использовать опцию --no-pad для этого решения для правильного форматирования выходного пробела.

Команда file передана в awk, поэтому мы можем указать разделитель полей, а затем повернуть поля и просто отсортировать их по конвейеру. См. Schwartzian_transform

file --no-pad * | awk -F ':' '{print $2": "$1}' | sort

Здесь используются все встроенные функции и не требуются внешние программы.

Если вы предпочитаете сохранить кодировки в правом столбце опцию -k можно использовать в другом решении, предоставленном @ Bayou.

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

file --no-pad * | awk -F ':' '{print $2": "$1|"sort"}'

Например, но, опять же, вы можете использовать awk более надежными способами:

file --no-pad * | awk -F ':' '{print $2": "$1}' | sort | uniq

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...