Архивировать все файлы в каталоге?

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

Также отметьте это /var/tmp не могло бы быть доступным в раннем процессе начальной загрузки, как /var и/или /var/tmp могут быть точки монтирования. Таким образом это немного сопоставимо с различием между /bin и /usr/bin. Первое доступно во время ранней начальной загрузки - последний после того, как система смонтировала все. Таким образом, большинство сценариев начальной загрузки будет использовать /tmp и нет /var/tmp для временных файлов.

Другое (предстоящее) местоположение на Linux для временных файлов /dev/shm.

504
29.11.2012, 01:40
5 ответов

Можно просто использовать *; нет никакой потребности в *.*. Расширения файла не являются особенными на Unix. * нуль соответствий или больше символов — включая точку. Таким образом, это соответствует foo.png, потому что это - нуль или больше символов (семь, чтобы быть точным).

Отметьте это * по умолчанию не соответствует файлам, начинающимся с точки (ни один не делает *.*). Это часто, что Вы хотите. В противном случае в ударе, если Вы shopt -s dotglob это будет (но все еще исключать . и ..). Другие оболочки имеют различные пути (или ни один вообще) включения dotfiles.

С другой стороны, zip также имеет a -r (рекурсивная) опция сделать все деревья каталогов сразу (и не иметь для волнения о dotfile проблеме):

zip -r myfiles.zip mydir

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

Можно также сказать zip не снабжать пути -j/--junk-paths опция.

zip команда идет с документацией, говоря Вам обо всем (много) опции; ввести man zip видеть ту документацию. Это не уникально для zip; можно получить документацию для большинства команд этот путь.

727
27.01.2020, 19:28
  • 1
    Вы могли бы хотеть добавить, что это считают хорошей практикой для содержания всего в архиве в каталоге верхнего уровня - так, чтобы каждый не загрязнял его текущий каталог на извлечении. –  peterph 28.11.2012, 18:54
  • 2
    @peterph сделан. Хотя это - меньше конвенция в zip-файлах, чем в, например, tarfiles, я боюсь. –  derobert 28.11.2012, 18:59
  • 3
    , к сожалению, да. Вероятно, из-за наследия окон drag'n'drop на рабочий стол и наследия Linux работы с исходными кодами. –  peterph 28.11.2012, 19:03
  • 4
    Имеют в виду это * оболочка-globbing не включает dotfiles (т.е. начало имен файлов .). Это - другое преимущество для архивирования целого каталога по имени. –  mrb 28.11.2012, 19:29
  • 5
    Но использование-r включает сам каталог, который повреждает то, что я делаю. Не был бы * включать . и ..? –  tkbx 28.11.2012, 19:30

Иначе должен был бы использовать, находят и xargs: (это могло бы включать a"." каталог в zip, но это должно все еще извлечь правильно. С моим тестом zip разделила точку перед сжатием), find . -type f -exec zip zipfile.zip {} +

( + может быть заменен \; если Ваша версия find не поддерживает + конец для должностного лица. Это будет медленнее хотя...),

Это будет по умолчанию включать все подкаталоги. На GNU находят -maxdepth может предотвратить это.

6
27.01.2020, 19:28

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

$ for file in *; do zip ${file%.*}.zip $file; done
11
27.01.2020, 19:28

Otro (método lento )para hacer esto (que agrega un archivo al zip a la vez):

for f in *.[^.]*; do
    [ -r "$f" ] || continue # Skip directories or non-existant files (Probably ".[^.]*" if directory has no dotfiles). Using -e will allow directories to be used as well
    zip zipfile.zip "$f" # If directories are included, you probably want to add -r
done

Esto tiene los problemas de archivo de puntos de*(solución alternativa agregada )y sería iniciar zip una vez para cada archivo, agregándolo al archivo. En bash, se ocuparía de una gran cantidad de archivos.

Sería más lento que la mayoría de los otros métodos, pero es relativamente simple.

3
27.01.2020, 19:28

Не .zipфайлов, а gzip *— это короткая команда, которая сжимает каждый файл в каталоге в отдельный .gzи удаляет оригинал. Действительно удобно во многих случаях, так как многие другие инструменты могут работать с файлами .gzнапрямую.

user@computer:~/test$ touch test1.txt
user@computer:~/test$ touch test2.txt
user@computer:~/test$ touch test3.txt
user@computer:~/test$ ls
test1.txt  test2.txt  test3.txt
user@computer:~/test$ gzip *
user@computer:~/test$ ls
test1.txt.gz  test2.txt.gz  test3.txt.gz
0
22.06.2021, 16:11

Теги

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