файлы tar только, никакие каталоги

Используя Ctrl+r можно искать историю:

pbm@tauri ~ $ 
(reverse-i-search)`xran': xrandr -o normal

Любая команда, которую Вы находите, могла быть отредактирована...


Я думаю, что нашел точно, в чем Вы нуждаетесь: выполненный shopt -s histverify и в следующий раз, когда Вы хотите использовать !n команда не будет выполняться, но только помещаться в командную строку...

16
06.04.2012, 21:29
7 ответов

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

find mydir -maxdepth 1 -type f -print0 | xargs -0 tar Avf mydir.tar
find mydir -maxdepth 1 -type f -exec tar Avf mydir.tar {} +

Ответ Iocnarz использования tar --null и -T опции работают также. Если Вы имеете cpio установленный, ответ camh с помощью этого прекрасно также. И если Вы имеете zsh и не возражайте использовать его для команды, ответ Gilles с помощью zsh шарика (*(.)) кажется самым простым.


Ключ был -maxdepth опция. Окончательный ответ, имея дело с пробелами соответственно:

find mydir -maxdepth 1 -type f -print0 | xargs -0 tar cvf mydir.tar

Это должно также работать:

find mydir -maxdepth 1 -type f -exec tar cvf mydir.tar {} +
11
27.01.2020, 19:48
  • 1
    Оба из них могут привести к нескольким вызовам tar. Оба xargs и find с + вариант имеет максимальное количество аргументов, которые могут быть переданы tar. Это приведет к второму вызову tar, перезаписывающего вывод первого. –  camh 07.04.2012, 01:30
  • 2
    Подробно останавливаясь на пределе xargs, xargs значение по умолчанию к максимальной командной строке на 128 кибибитов. Если список файлов больше, Вы получаете секунду (или больше) вызов команды (tar), ведя к тихой потере данных. Можно использовать -x вынудить xargs перестать работать вместо того, чтобы терять данные, и в то время как лучше, чем тихая ошибка данных потерь, это все еще не идеально. Эта ошибка вида так опасна, потому что все кажется OK сначала, но поскольку список файлов растет со временем, Вы начинаете инициировать его и не можете заметить, пока Вы не пытаетесь восстановить свое резервное копирование. Затем слишком поздно. –  camh 07.04.2012, 01:49
  • 3
    @camh Вы правы, благодарит указать на это; я обновил для отражения этого. –  Kevin 07.04.2012, 06:22
  • 4
    "Окончательный ответ" не корректен при использовании "tar c" без,-T Вы могли бы получить частичные результаты. –  eckes 31.05.2013, 20:27

Я не уверен, что понимаю Ваши требования. Если Вы хотите хранить регулярные файлы в mydir но не его подкаталоги, самый легкий путь состоит в том, чтобы использовать zsh, где соответствие регулярным файлам только является простым вопросом использования . спецификатор шарика:

tar cf mydir.tar mydir/*(.)
3
27.01.2020, 19:48

Как вводный абзац в man tar говорит (последнее предложение),

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

Который я понимаю как ответ "нет" на Ваш вопрос.

2
27.01.2020, 19:48
  • 1
    , за исключением того, что tar теперь включает многочисленное исключение meachisms (например. --no-recursion, --exclude-tag, и т.д.). Я изучаю --exclude-tag который выглядит многообещающим, но, кажется, полная противоположность того, что я ищу. –  ateiob 18.11.2011, 17:21
  • 2
    я попробовал это и я видел, что символы были удалены из долгих путей. Используя tar с-T и - пустой указатель как camh предложенный избежал этой проблемы. –  Paul Brannan 26.05.2015, 22:45

Можно даже использовать find ... -print0 и tar ... --null непосредственно без использования xargs вообще.

find . -maxdepth 1 -type f -print0 | tar cvf mydir.tar --null -T -

В данном примере, --no-recursion опция к tar не необходимо, потому что только пути файлов (и не каталоги) будут переданы от find кому: tar.

Используя --no-recursion опция к tar в следующем примере, однако, предотвращает tar из двойных каталогов архивации. find сделает рекурсию дерева каталогов вместо tar затем.

# compare
find . -print0 | tar cf mydir.tar --null -T -
tar -tf mydir.tar | nl

find . -print0 | tar cf mydir.tar --null --no-recursion -T -
tar -tf mydir.tar | nl
3
27.01.2020, 19:48

Когда Вы хотите использовать find с tar, лучший способ состоит в том, чтобы использовать cpio вместо tar. cpio может записать архивы tar и разработан для взятия списка файлов для архивации от stdin.

find mydir -maxdepth 1 -type f -print0 | cpio -o -H ustar -0 > mydir.tar

Используя find и cpio больше подхода unix-y, в котором Вы позволяете find сделайте выбор файла со всей силой, которую он имеет, и позволить cpio сделайте архивацию. Стоит изучить это простое использование cpio, поскольку Вам легко решить проблемы, Вы ударяете Вашим вперед о при попытке tar.

14
27.01.2020, 19:48
  • 1
    Brilliant! Я использовал cpio в удаленном прошлом, но никогда не знал о ustar опции. –  Ian McGowan 23.02.2016, 20:07
  • 2
    Это работало намного лучше на меня, чем принятый ответ. –  Dale Anderson 22.09.2016, 19:47
star -c -C startdir -find . ! -type d > out.tar

Опустите -C startdir и замените . с startdir , если он должен появиться в архиве.

Это наиболее эффективный метод, основанный на возможностях libfind. Libfind также предлагает основные параметры -chown -chgrp -chmod , которые изменяют структуру stat на месте и позволяют архивировать различные метаданные. Это также работает в режимах списка и извлечения и во многих случаях избавляет от необходимости извлекать весь архив.

1
27.01.2020, 19:48

Я мог бы найти решение.

find mydir -type f -printf '% P \ 0' | tar czvf mydir.tar.gz -C mydir --null -T -

Это может быть немного дорого, но в любом случае это сработает, потому что это не зависит от xargs.

0
27.01.2020, 19:48

Теги

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