Использование tar с поиском

Допустим, мы хотим найти определенные файлы, использовать tar и удалить их. Я попытался использовать

touch "mycompress.bz2.tar" find . \( -name "*.c" -o -name "*.sh*" \) -exec tar ujf "mycompress.bz2.tar" {} "+" \; -exec rm {} \; 

Но выполнение этого моего терминала просто закрывается. Как я могу реализовать это правильно?

  • По соглашению, куда пакеты идут, чтобы установить на другие машины?
  • tar-эквивалент zip -o (-latest-time)?
  • Почему конкретная последовательность вариантов имеет значение для команды tar?
  • Как создать папку, которая изменит его содержимое на то, что имеет папка?
  • Тар перезаписывает файлы только для чтения
  • Посмотрите содержимое журнала tar без их извлечения
  • Как создать tar.gz каждого файла определенного типа в одной команде?
  • сжатие tar без структуры каталогов
  • 2 Solutions collect form web for “Использование tar с поиском”

    С вашей командой возникает несколько проблем.

    Первый – сжатый архив не может быть обновлен. Вам нужно будет сначала создать несжатый архив, обновить его и, наконец, сжать.

    Второй из них – это синтаксис tar который неверен, предложение first -exec должно использовать либо + terminator, либо \; один, но не оба.

    Третий более тонкий и возникает, если вы держите + terminator, предложение second -exec будет выполняться для каждого файла в последовательности, в то время как первый будет ждать, пока список файлов будет сохранен, чтобы заполнить строку среды, которая будет запущена. Когда это произойдет, все файлы, которые будут сохранены первым -exec будут уже удалены вторым -exec поэтому tar завершится с ошибкой, и вы потеряете все свои файлы.

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

     tar --files-from <(find . \( -name "*.c" -o -name "*.sh*" \)) \ --remove-files -cjf mycompress.bz2.tar 

    GNU tar документирован для удаления файлов только после их сохранения:

     $ man gtar ... --remove-files remove files after adding them to the archive ... 

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

    С одной из обычных реализаций tar это не работает.

    С 1982 года существует бесплатная реализация tar которая называется star .

    star добавила встроенную утилиту find в 2005 году на основе моего libfind .

    Вы вызываете star -c -f file.out -find . \( -name "*.c" -o -name "*.sh*" \) star -c -f file.out -find . \( -name "*.c" -o -name "*.sh*" \)

    Правила для встроенного find просты: все в правой части -find следует правилам командной строки для find(1) .

    См. http://schilytools.sourceforge.net/index.html.

    и страницу звездного человека по адресу: http://schilytools.sourceforge.net/man/man1/star.1.html

    Существует отдельный источник (см. Веб-сайт), но самая последняя и лучшая версия в настоящее время является частью schilytools .

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

    rm $(star -t -tpath < file.out)

    Это удалит только файлы, которые были успешно помещены в архив.

    Interesting Posts
    Linux и Unix - лучшая ОС в мире.