2013-09-07 1 views
5

У меня есть несколько сотен тысяч файлов в разных подкаталогах, все из которых находятся в одном родительском каталоге, например.Как использовать tar для архивирования файлов из разных каталогов без структуры каталогов

/home/dir1/file1 
/home/dir2/file2 
/home/dir3/file3 
... 
/home/dir10000/file10000 

Как использовать tar, чтобы мой архив tar выглядел так?

file1 
file2 
file3 

Я могу гарантировать, что имена файлов уникальны. Я не хочу включать исходную структуру каталогов.

Спасибо, что помогли людям!

ответ

-1

Откройте командную строку и введите

tar -cvf NAME.tar /home/dir1/file1 /home/dir1/file2 /home/dir1/file3 

Надеется, что это помогает :)

+0

У меня есть несколько 100-10000 файлов, где я не знаю названия. Любая другая идея, где я просто могу использовать каталог/home? – user1876422

+0

Это не ответ на вопрос о том, как избежать структуры каталогов в tarball –

+0

В основном это все равно создаст структуру папок в tar/tgz – ghitesh

2

Возможным решения может быть использование обычного tar команды (плевков на ее стандартном выводе), а затем к трубе в архив в tardy, вероятно, с его -No_Directories вариант, т.е.

tar cf - /home/dir?/ | tardy -No-Directories > yourbig.tar 

Однако я не уверен, что это хорошая идея. Наличие tar-шара, который извлекается в сотни тысяч файлов в одном каталоге, не является хорошей идеей (некоторые файловые системы ведут себя плохо с этим).

3

GNU tar примет параметр преобразования, который является просто выражением sed, которое преобразует имя файла в архив. Вам также, вероятно, захочется подключиться к xargs, если ваш список файлов очень велик.

cat filelist | xargs tar -rvf archive.tar --transform='s|.*/||g' 

Имейте в виду, что это добавление в архив дегтя (он будет создать, если он еще не существует), так что вы хотите, чтобы удалить архив, если он уже существует перед запуском этой команды.

3

Один из способов решить эту проблему без cat Инг или | ИНГ других программ:

tar --transform 's,.*/,,g' -cvf mytarfile.tar /path/to/parent_dir 

# --transform accepts a regular expression similar to sed. 
# I used "," as a delimiter so I don't have to escape "/" 
# This will replace anything up to the final "/" with "" 
# /path/to/parent_dir/sub1/sub2/subsubsub/file.txt -> file.txt 
# /path/to/parent_dir/file2.txt -> file2.txt 

В отличии от Aaron Okano означает, что нет необходимости трубы xargs, если у вас есть длинный список файлов в один/несколько родительских каталогов, которые вы можете указать в командной строке.