2014-02-16 2 views
0

Я пытался сжать набор файлов, содержащих пробелы в именах файлов, используя файл bash. Файл Баш:Сжатие списка файлов содержит пробелы в именах файлов

#!/bin/bash 
tar -cPf 'myconfigs.tar' `cat myconfigs.list` 

Содержание myconfigs.list файла:

/home/anas/.config/chromium/Default/Bookmarks 
/home/anas/.config/chromium/Default/Login Data 
/home/anas/.config/chromium/Default/Login Data-journal 

Проблема состоит в том, что файлы содержат пробелы в их файловых имен не будут включены в архив результат TAR , Я пробовал '', "",% 20 ... но не работал.

Спасибо за вашу помощь заранее.

+0

@galaxy, @anubhava: Кстати, я пытаюсь заменить '/ home/anas/'с' ~/', но я не смог, любое решение, пожалуйста? –

ответ

3

Не используйте выход cat таким образом, чтобы в противном случае пространство считалось разделителем и аргументом separete команде tar.

Вы можете использовать -T tar option:

tar -cPv -T myconfigs.list -f myconfigs.tar 
4

Анаса,

Я думаю, вам нужно использовать:

tar -cPf myconfigs.tar -T myconfigs.list 

вместо ваших "кошек". cat должен работать, если вы правильно избегаете имена файлов внутри, но -T лучше.

ОБНОВЛЕНО (в ответ на свой вопрос в комментариях Вопрос в): Я не могу комментировать в вашем вопросе (не хватает репутации), так что я решил улучшить свой ответ вместо этого.

Расширение тильды (~) - это оболочка, смола не поддерживает ее. Однако, чтобы достичь того, чего вы хотите достичь, вы можете использовать следующий трюк:

  • использовать относительные пути в файле myconfigs.list (относительно домашнего каталога):
 
    .config/chromium/Default/Bookmarks 
    .config/chromium/Default/Login Data 
    .config/chromium/Default/Login Data-journal 
  • запустить деготь таким образом, что он изменяет каталог для вашего дома при запуске:
 
    tar -cPf myconfigs.tar -C ~/ -T myconfigs.list 

Хорошо, я пошел вперед и создал пример сеанса, иллюстрирующий это:

[email protected]:~ # useradd -m galaxy 
[email protected]:~ # su - galaxy 
[email protected]:~ $ mkdir -p {1,2}/{3,4}/{5,6,7} 
[email protected]:~ $ find . -xdev -type d -exec touch '{}/file.txt' \; 
[email protected]:~ $ cat <<EOF> include.lst 
> 1/3 
> 1/4/5/file.txt 
> 1/4/7 
> 2/file.txt 
> EOF 
[email protected]:~ $ cd 2/3/6 
[email protected]:~/2/3/6 $ tar cjSpf ~/sample.tar.bz2 -C ~/ -T ~/include.lst 
[email protected]:~/2/3/6 $ cd 
[email protected]:~ $ tar tjvf sample.tar.bz2 
drwx------ galaxy/galaxy  0 2014-02-19 04:10 1/3/ 
-rw------- galaxy/galaxy  0 2014-02-19 04:10 1/3/file.txt 
drwx------ galaxy/galaxy  0 2014-02-19 04:10 1/3/7/ 
-rw------- galaxy/galaxy  0 2014-02-19 04:10 1/3/7/file.txt 
drwx------ galaxy/galaxy  0 2014-02-19 04:10 1/3/6/ 
-rw------- galaxy/galaxy  0 2014-02-19 04:10 1/3/6/file.txt 
drwx------ galaxy/galaxy  0 2014-02-19 04:10 1/3/5/ 
-rw------- galaxy/galaxy  0 2014-02-19 04:10 1/3/5/file.txt 
-rw------- galaxy/galaxy  0 2014-02-19 04:10 1/4/5/file.txt 
drwx------ galaxy/galaxy  0 2014-02-19 04:10 1/4/7/ 
-rw------- galaxy/galaxy  0 2014-02-19 04:10 1/4/7/file.txt 
-rw------- galaxy/galaxy  0 2014-02-19 04:10 2/file.txt 
[email protected]:~ $ 

Этот должен дать вам начать :)

+0

Трюк не сработал? :( –

+0

Ну, он должен был. Получали ли вы какие-либо сообщения об ошибках? Проверьте документацию tar на опции -T и -C. Некоторые tar позволяют вам включать -C в файл, который вы используете с помощью -T. О, и какой пользователь вы используете эту команду под? Если это не «anas», вам нужно использовать «~ anas /» вместо «~ /». – galaxy

+0

В результате я получаю пустой 'myconfigs .tar'. Дело в том, что я хочу создавать резервные файлы _Current-user_ независимо от имени пользователя, просто текущего пользователя ('~ /'). btw, я использую tar v1.26. –

Смежные вопросы