распаковать имя файла.tr.gz в каталог с именем файла

Я хотел бы распаковать архив, например. "tar123.tar.gz" в каталог /myunzip/tar123/" с помощью команды оболочки.

tar -xf tar123.tar.gz распаковывает файлы, но в тот же каталог, где я работаю.

Если имя файла будет «tar233.tar.gz», я хочу, чтобы он был распакован в /myunzip/tar233.tar.gz, чтобы каталог назначения основывался на имени файла.

Кто-нибудь знает, может ли команда tar это сделать?


person Jorre    schedule 01.06.2010    source источник


Ответы (3)


С Bash и GNU tar:

file=tar123.tar.gz
dir=/myunzip/${file%.tar.gz}
mkdir -p $dir
tar -C $dir -xzf $file
person Randy Proctor    schedule 01.06.2010
comment
проблема в том, что я не знаю, каким будет имя файла. Это будет версионный файл, поэтому сегодня это может быть 1.tar.gz, а завтра это может быть 2.tar.gz. Есть ли способ просто сказать file=what-ever-in-/home/user ? - person Jorre; 01.06.2010
comment
Вы должны будете как-то это узнать. Если они сортируются, вы можете использовать что-то вроде file=$(ls -1 $pattern | tail -1). - person Randy Proctor; 01.06.2010

Вы можете изменить каталог перед извлечением с помощью флага -C, но каталог уже должен существовать. (Если вы создаете каталоги для конкретных файлов, я настоятельно не рекомендую называть их foo.tar.gz — расширение подразумевает, что это архивный файл, но на самом деле это каталог. Это приведет к путанице.)

person Kilian Foth    schedule 01.06.2010

Пытаться

file=tar123.tar.gz
dir=/myunzip/$(basename $file .tar.gz)   # matter of taste and custom here
[ -d "$dir" ] && { echo "$dir already exists" >&2; exit 1; }
mkdir "$dir" && ( gzip -d "$file | ( cd "$dir" && tar xf - ) )

Если вы используете GNU tar, вы также можете указать для него параметр -C "$dir", который заставит его перейти в каталог перед извлечением. Но приведенный выше код должен работать даже со смолой бронзового века.

Отказ от ответственности: ни один из приведенных выше кодов не тестировался.

person Norman Ramsey    schedule 01.06.2010