
Как сжать файлы, чтобы их выходное имя совпадало с именем родительской папки?
Например, у меня есть папки:
ubup@neter:/NeuroNER-master/output$ tree
.
├── en_2017-04-28_20-26-59-439552
│ ├── 000_test.txt
│ ├── 000_test.txt_conll_evaluation.txt
│ ├── 000_train.txt
│ ├── 000_train.txt_conll_evaluation.txt
│ ├── 000_valid.txt
│ ├── 000_valid.txt_conll_evaluation.txt
│ ├── 001_test.txt
│ ├── 001_test.txt_conll_evaluation.txt
│ ├── 001_train.txt
│ ├── confusion_matrix_for_epoch_0005_in_valid_binary_evaluation.df
│ ├── confusion_matrix_for_epoch_0005_in_valid_bio_evaluation.df
│ ├── confusion_matrix_for_epoch_0005_in_valid_token_evaluation.df
│ ├── model
│ │ ├── checkpoint
│ │ ├── dataset.ickle
│ │ ├── tensorboard_metadata_characters.sv
│ ├── results.son
│ └── tensorboard_logs
│ ├── test
│ │ └── events.ut.fevents.493425627.er
Я хотел бы сжать папку en_2017-04-28_20-26-59-439552
вen_2017-04-28_20-26-59-439552.tar.bz2
Я мог бы использовать бесплатную программу с открытым исходным кодом lbzip2
:
tar -c -I lbzip2 -f en_2017-04-28_20-26-59-439552.tar.bz2 *
Однако я не хочу, чтобы команда содержала имя файла архива ( en_2017-04-28_20-26-59-439552.tar.bz2
), поскольку в моем приложении я не знаю его заранее.
решение1
В итоге я использовал следующий bash-скрипт:
for d in */ ; do
tar -c -I lbzip2 -f "${d%/}.tar.bz2" "$d"
done
Некоторые комментарии:
for d in */ ; do
цикл по каталогам (Как выполнить цикл только по каталогам в bash?)${d%/}
$d
удаляет завершающий слеш в имени папки ( если бы завершающего слеша не было, имя папки осталось бы неизменным).- При этом создается архив как для подкаталогов текущих каталогов, так и для символических ссылок в текущем каталоге, указывающих на существующий каталог.