2016-02-16 3 views
0

Давайте предположим, что у меня есть следующая структура каталоговКак исключить определенные файлы с помощью команды tar?

dir/ 
├── subdir 
│   ├── dir 
│   │   └── TODO.txt 
│   └── TODO.txt 
└── TODO.txt 

Я желаю связывать dir/ рекурсивно в тарболла с командой tar на Linux, но я хочу, чтобы исключить корень todo.txt. Как я могу указать это с относительным путем?

Попытка # 1

tar -czf dir.tar.gz dir/ --exclude='TODO.txt' 

Не работает: он избавляется от каждого todo.txt в результате тарболла:

dir/ 
└── subdir 
    └── dir 

Попытка # 2

tar -czf dir.tar.gz dir/ --exclude='dir/TODO.txt' 

Это также не удается, потому что подкаталог dir также соответствует этому шаблону. Полученный тарбол, следовательно, содержит

dir/ 
└── subdir 
    ├── dir 
    └── TODO.txt 

Есть ли способ, я могу точно определить, что я хочу, чтобы исключить корень todo.txt с относительным путем?

+0

Разве вы не можете просто перенести этот один файл в стороне во время создания архива? – arkascha

+1

В противном случае вы можете подать команду 'tar' с выводом' find', который вы фильтруете с помощью 'grep -v', который позволяет привязать шаблон к началу хита. – arkascha

+0

Неправильный сайт, а не вопрос программирования. – tink

ответ

0

От @arkascha «ы ответ:

find dir/ -type f | grep -v "^dir/TODO.txt" > files.txt 

затем

tar -czf dir.tar.gz -T files.txt 

От первой линии, есть 2 уловок, чтобы обратить внимание на:

  1. The -type f вариант. Если не поставить, каталоги будут включены в результат find. Это плохо, потому что он будет включать каждый файл столько раз, сколько их глубина в иерархии файлов.
  2. ^ в регулярных выражениях grep «s: он гарантирует, что мы исключая шаблон из начала файловой иерархии
Смежные вопросы