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

Я хотел бы иметь возможность сделать это одной строкой, без использования каких-либо сценариев .sh , чтобы этот процесс можно было воспроизвести как можно более мобильно.


Пример структуры каталогов:

$ ls -1F

bar-dir/
bar.with.dots
foo-directory/
foo-no-ext
quux.dir/
quux.ext

В этом случае tar должен содержать только foo-no-ext .


Самое близкое, что я придумал, это далеко

tar -cf archive.tar --exclude=*.* --no-recursion *

Но при выполнении в семпле выборки archive.tar прежнему включает в себя подкаталоги (хотя и пустые):

$ tar -tf archive.tar

bar-dir/
foo-directory/
foo-no-ext

2 ответа2

3

Эта команда делает то, что вы хотите:

 find * -maxdepth 0 -type f | tar -cf archive.tar --exclude=*.* -T -

Команда find находит все файлы * только в текущем каталоге -maxdepth 0 которые являются файлами -type f (не каталоги, устройства или другие специальные файлы). Полученные файлы передаются в tar, который исключает имена, содержащие точку.

1

Как насчет:

tar -cf archive.tar `ls|grep "^[^.]*$"`

Он не ожидает многого от оболочки, но предполагает, что grep существует (я никогда не видел системы без него).

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .