Tar весь PDFs в каталоге, сдерживающей структуре каталогов

Поскольку, когда Вы используете sudo bash, bash не не действует как оболочка входа в систему. Попробуйте еще раз с sudo bash -l и необходимо видеть тот же результат как su -.

Если это корректно, то различие в PATH находится в конфигурационных файлах: /etc/profile, ~/.bash_profile, ~/.bash_login, ~/.profile выполняются (в том порядке) для оболочки входа в систему, в то время как ~/.bashrc выполняется для невхода в систему интерактивная оболочка.

11
14.08.2011, 21:37
2 ответа

Это перечислит весь PDFs:

$ find dir/ -name '*.pdf'
./dir/subdir2/subsubdir1/document.pdf
./dir/subdir3/another-document.pdf

Можно передать это по каналу к xargs получить его как разграниченную одиночным пробелом строку и канал это к tar создать архив:

$ find dir/ -name '*.pdf' | xargs tar czf dir.tar.gz

(Этот путь опускает пустые каталоги),

10
27.01.2020, 19:58
  • 1
    Это является настолько потрясающим, спасибо за справку. Вот то, что я придумал: find docs \( -iname '*.pdf' -o -iname '*.mp3' \) -printf '"%p"\n' | xargs tar czf docs-media.tar.gz –  Matt Alexander 10.01.2011, 22:26
  • 2
    @mattalexx: Остерегайтесь та эта команда не будет работать, если какие-либо из имен файлов будут содержать пробелы или \'" (отказ xargs), и не будет работать, если будет слишком много имен файлов (отказ ядра). –  Gilles 'SO- stop being evil' 10.01.2011, 22:29
  • 3
    @Gilles Относительно имен файлов с пробелами и одинарными кавычками, -printf '"%p"\n' часть заботится о том (по крайней мере, она сделала для меня). –  Matt Alexander 10.01.2011, 22:31
  • 4
    @Gilles, Интересный об ограничении ядра. Сколько аргументов Вы можете иметь в команде в Linux? –  Matt Alexander 10.01.2011, 22:32
  • 5
    О, на “не будет работать”, обратите внимание, что вид отказа здесь - то, что, если командная строка является слишком длинной, xargs разделит ее, так, чтобы последний вызов tar тихо перезаписал файлы, записанные предыдущими вызовами. –  Gilles 'SO- stop being evil' 10.01.2011, 22:46

С ударом ≥4 или zsh и tar GNU:

tar -czf dir.tar.gz dir/**/*.pdf

Это не могло бы работать, если у Вас есть очень большое количество файлов PDF, и командная строка является слишком длинной. Затем Вам была бы нужна более сложная находка - базирующееся решение (снова, с помощью tar GNU):

tar -cf dir.tar -T /dev/null
find dir -name '*.pdf' -exec tar -rf dir.tar {} +
gzip dir.tar

Кроме того (и портативно) можно создать архив с миром.

pax -w -x ustar -s '/\.pdf$/&/' -s '/.*//' . | gzip >dir.tar.gz

Первое -s говорит для включения всех .pdf файлы, не меняя их имя. Второе -s говорит для переименования всех других файлов к пустому названию, которое на самом деле означает не включать их в архив.

6
27.01.2020, 19:58
  • 1
    О, да я означал упоминать zsh's **; Я даже не понял, что удар 4 имел это теперь –  Michael Mrozek♦ 10.01.2011, 22:34

Теги

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