Как сжать файлы, чтобы их выходное имя совпадало с именем родительской папки?

Как сжать файлы, чтобы их выходное имя совпадало с именем родительской папки?

Как сжать файлы, чтобы их выходное имя совпадало с именем родительской папки?

Например, у меня есть папки:

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удаляет завершающий слеш в имени папки ( если бы завершающего слеша не было, имя папки осталось бы неизменным).
  • При этом создается архив как для подкаталогов текущих каталогов, так и для символических ссылок в текущем каталоге, указывающих на существующий каталог.

Связанный контент