2014-11-20 3 views
-1

Я делаю файл сборки, и мне нужна ваша помощь, пожалуйста.Как удалить пустые каталоги после tar?

  1. Текущих каталоги/файлы расположены как Подписки /home/myhome/aaa/bbb/ccc/file1 /home/myhome/aaa/bbb/ccc/ddd/file2 /home/myhome/aaa/bbb/ccc/eee/file3 /home/myhome/aaa/bbb/fff/file4 /home/myhome/aaa/bbb/fff/ggg/file5 /home/myhome/aaa/bbb/fff/hhh/file6 /home/myhome/aaa/bbb/iii/file7 /home/myhome/aaa/bbb/iii/jjj/file8 /home/myhome/aaa/bbb/iii/kkk/file9

  2. Я хочу, чтобы получить целевые файлы из list.txt и связать в один архив.
    кошка list.txt /aaa/ /aaa/bbb/ /aaa/bbb/fff/ /aaa/bbb/fff/file4 /aaa/bbb/fff/ggg/ /aaa/bbb/fff/ggg/file5 /aaa/bbb/fff/hhh/ /aaa/bbb/fff/hhh/file6 /aaa/bbb/iii/ /aaa/bbb/iii/file7 /aaa/bbb/iii/jjj/ /aaa/bbb/iii/jjj/file8 /aaa/bbb/iii/kkk/ /aaa/bbb/iii/kkk/file9

  3. Я попытался, как показано ниже. sed -e '\@/[email protected] d' -e '[email protected]^/@@' list.txt > list2.txt tar -cz -f list.tar.gz -C /home/myhome -T list2.txt --remove-files --same-permissions

  4. И последующие перерабатывающие каталоги/файлы.
    (пустые каталоги не были удалены.) /home/myhome/aaa/bbb/ccc/file1 /home/myhome/aaa/bbb/ccc/ddd/file2 /home/myhome/aaa/bbb/ccc/eee/file3 /home/myhome/aaa/bbb/fff/ggg/ /home/myhome/aaa/bbb/fff/hhh/ /home/myhome/aaa/bbb/iii/jjj/ /home/myhome/aaa/bbb/iii/kkk/

  5. Но, это то, что я ожидал. /home/myhome/aaa/bbb/ccc/file1 /home/myhome/aaa/bbb/ccc/ddd/file2 /home/myhome/aaa/bbb/ccc/eee/file3

Не могли бы вы мне помочь, пожалуйста?

====================
ответ на комментарии

Теперь я попытался изменить list2.txt (с помощью Vim не скрипт), как следующие.
кошка list2.txt aaa/bbb/iii/kkk/file9 aaa/bbb/iii/kkk/ aaa/bbb/iii/jjj/file8 aaa/bbb/iii/jjj/ aaa/bbb/iii/file7 aaa/bbb/iii/ aaa/bbb/fff/hhh/file6 aaa/bbb/fff/hhh/ aaa/bbb/fff/ggg/file5 aaa/bbb/fff/ggg/ aaa/bbb/fff/file4 aaa/bbb/fff/

Это то, что я хочу! Благодарю вас, Этан.

Но я не знаю, как удалить ааа, ааа/ГЭБ от оригинального list.txt.
В этом случае aaa/bbb является общим родительским каталогом, но в некоторых случаях его можно изменить на aaa/bbb/zzz.

+0

Вопрос в том, почему tar не удалил пустые 'fff/ggg',' fff/hhh' и т. Д. Каталоги? –

+0

Спасибо! Я ответил в теле. – myungchul

+0

Я не понимаю обновленный вопрос. Вы хотите удалить каталог '/ aaa/bbb' с диска или из пути в файле? –

ответ

0

У вас есть опечатка в вашем SED вызова:

sed -e '\@/[email protected] d' -e 's/@^/@@' list.txt > list2.txt 

Вы недоставало в / после s в выражении -e s.... Без этого исправления list2.txt будет пустым.

+0

'@' в этом выражении является маркером не '/'. Ваша версия является синтаксической ошибкой, поскольку окончательный '/' не существует. Его версия правильна, чтобы заменить ведущую косую черту ничем. –

+0

@EtanReisner, это не сработало для меня, когда я попробовал - пришлось добавить '/' во второй '-e'. – vikramls

+0

Какую версию sed вы используете? Что (ошибка?) Вы получаете, если вы запустите 'echo/foo/bar | sed -e's @ ^/@@ ''? –

0

Так как ваш просят, чтобы удалить пустые папки только (Хотя я думаю, что команда sed странно/неправильно, я не имею ни малейшего представления о своей цели, и, таким образом, я не могу внести изменения в sed. Я просто предположим, ваш sed отлично работает для вашей цели), вот способ сделать это:

xargs -i rmdir {} < flist.txt 2> /dev/null 
xargs -i dirname {} < flist.txt | xargs -i rmdir {} 2> /dev/null 

Первая линия касается каждой строки flist.txt в качестве имени каталога и попытаться удалить его, когда он пуст (потерпеть неудачу, если это файл, который в порядке). Вторая строка берет каждую строку flist.txt и получает ее верхнее имя каталога и пытается удалить ее, когда она пуста.

Примечание: Этот сценарий не обрабатывает пробелы в именах каталогов/файлов.

+0

Спасибо, я попробую. – myungchul