Рейтинг:2

Как этот код работает для сжатия файла?

флаг us

Я прочитал эту строку кода:

compress_size_bzip2=$(bzip2 "$file" ; stat -c %s "$file.bz2")

Может ли кто-нибудь помочь мне понять эту команду и как я могу написать этот код другими способами?

James S. avatar
флаг de
Это не вопрос об Ubuntu. В будущем, задавая общие вопросы о Unix и Linux, вы должны использовать этот обмен стеками: https://unix.stackexchange.com/
Рейтинг:12
флаг cn
raj

Давайте разберем эту команду.

  1. compress_size_bzip2 = что угодно устанавливает значение переменной оболочки, называемой Compress_size_bzip2 (просто имя без особого смысла) что-либо что написано на правой руке = подписать.

  2. Что что-либо в нашем случае $(команда). Это подстановка команды; значение этой конструкции равно любому команда пишет на выходе.

  3. команда является: bzip2 "$ файл" ; stat -c %s "$file.bz2", так что на самом деле две команды выполняются одна за другой. Первая команда, bzip2 "$ файл" сжимает файл, имя которого берется из переменной оболочки файл. Кавычки там, если имя содержит пробелы. Обычно эта команда ничего не записывает. Вторая команда, stat -c %s "$file.bz2", выводит размер файла, имя которого является значением переменной оболочки файл плюс расширение .bz2.

Таким образом, этот размер является результатом всего команда, и он присваивается переменной Compress_size_bzip2.

Если вы установите переменную файл к имени файла, который вы хотите сжать, например файл = мой файл.txt, а затем запустите указанную выше строку, произойдут две вещи:

  1. файл мой файл.txt будет сжато в мой файл.txt.bz2
  2. размер файла мой файл.txt.bz2 будет присвоено переменной Compress_size_bzip2. Вы можете отобразить это значение с помощью команды эхо $compress_size_bzip2.
Рейтинг:7
флаг in
  1. bzip2 "$ файл"
    

    Это будет работать bzip2 по имени файла, сохраненному в переменной "$file". bzip2 сожмет файл в новый файл с именем $file.bz2.

  2. stat -c %s "$file.bz2"
    

    Это работает статистика на только что созданном компрессе $file.bz2:

    От мужская статистика:

    stat - показать статус файла или файловой системы
    
        -c --format=ФОРМАТ
             использовать указанный FORMAT вместо значения по умолчанию
        %s общий размер, в байтах
    

    Итак, это статистика Команда вернет размер файла в байтах нового файла.

  3. $(некоторая_команда)
    

    Это называется подстановка команды

    Bash выполняет расширение, выполняя команду в среде подоболочки и заменяя подстановку команды стандартным выводом команды.

    Так, var=$(некоторая_команда) сохраняет вывод some_command в переменную вар.


В итоге:

compress_size_bzip2=$(bzip2 "$file" ; stat -c %s "$file.bz2")

Это работает bzip2 и статистика в подоболочке. Вывод подоболочки — это размер сжатого файла в байтах, который будет сохранен в переменной $compress_size_bzip2.


Тем не менее, есть возможности для улучшения:

Вы должны комбинировать команды в подоболочке с &&, так статистика работает только тогда, когда bzip2 Был успешен.

Если вам не нужен сжатый файл, вы должны указать bzip2 сжать до стандартного вывода с помощью флаг и использовать туалет -с сказать его размер:

compress_size_bzip2=$(bzip2 -c "$file" | wc -c)
2012rcampion avatar
флаг kp
Последняя команда не работает; дескриптор файла является символической ссылкой, а `stat` считывает размер самой символической ссылки. (Всегда 64 байта в моей системе). Вы можете увидеть это, удалив опцию `-c %s`. Однако, даже если мы получаем `stat` для перехода по ссылке с опцией `-L`, базовый файл является fifo, поэтому размер - это только то, что в данный момент буферизовано; и так как `stat` запускается немедленно, `bzip2` не успевает ничего записать, и сообщаемый размер будет равен нулю. Вместо этого вы должны использовать что-то вроде `bzip2 -c "$file" | туалет -с`.
pLumo avatar
флаг in
Вы совершенно правы. Я заменил неправильную команду. Спасибо за наводку.

Ответить или комментировать

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