Извлеките .tgz в определенную подпапку, только если в tar есть файлы, которые будут извлечены в мой CWD - PullRequest
4 голосов
/ 01 октября 2011

Большинство tar-файлов извлекаются в свои собственные подпапки (потому что люди, которые пишут утилиты с открытым исходным кодом, удивительные люди).

Некоторая выдержка в моем cwd, которая загромождает все. Я знаю, что есть способ увидеть, что находится в tar, но я хочу написать bash-скрипт, который, по сути, гарантирует, что я не получу 15 файлов, извлеченных в мою домашнюю папку.

Есть указатели?

псевдокод:

if [listing of tar files] has any file that doesn't have a '/' in it:
    mkdir [tar filename without extension]
    tar xzvf [tar filename] into [the new folder]
else:
    tar xzvf [tar filename] into cwd

EDIT:

Оба решения хороши, я выбрал следующее решение, потому что я просил сценарий bash, и он не зависит от дополнительного программного обеспечения.

Однако на моей собственной машине я использую aunpack, потому что он может обрабатывать множество форматов.

Я использую его со сценарием оболочки, который загружает и распаковывает все сразу. Вот что я использую:

#!/bin/bash
wget -o temp.log --content-disposition $1
old=IFS
IFS='
'
r=`cat temp.log`
rm temp.log
for line in $r; do
    substring=$(expr "$line" : 'Saving to: `\(.*\)'\')
    if [ "$substring" != "" ]
    then
        aunpack $substring
        rm $substring
        IFS=$old
        exit
    fi
done
IFS=$old

Ответы [ 2 ]

7 голосов
/ 01 октября 2011

Команда aunpack из пакета atool делает это:

aunpack извлекает файлы из архива. Часто хочется извлечь все файлы в архиве в один подкаталог. Тем не менее, некоторые архивы содержат несколько файлов в своем корне каталоги. Программа aunpack преодолевает эту проблему сначала извлекая файлы в уникальный (временный) каталог, а затем переместить его содержимое обратно, если это возможно. это также предотвращает перезапись локальных файлов по ошибке.

2 голосов
/ 01 октября 2011

Вы можете использовать комбинацию tar вариантов для достижения этой цели: tar опция для листинга:

   -t, --list
          list the contents of an archive

tar опция для извлечения в другой каталог:

   -C, --directory DIR
          change to directory DIR

Таким образом, в вашем скрипте вы можете перечислить файлы и проверить, есть ли в списке файлы, которые не имеют "/", и на основании этого вывода вы можете вызвать tar с соответствующими параметрами.
Пример для справки выглядит следующим образом:

TAR_FILE=<some_tar_file_to_be_extracted>
# List the files in the .tgz file using tar -tf
# Look for all the entries w/o "/" in their names using grep -v 
# Count the number of such entries using wc -l, if the count is > 0, create directory
if [ `tar -tf ${TAR_FILE} |grep -v "/"|wc -l` -gt 0 ];then
   echo "Found file(s) which is(are) not in any directory"
   # Directory name will be the tar file name excluding everything after last "."
   # Thus "test.a.sh.tgz" will give a directory name "test.a.sh"
   DIR_NAME=${TAR_FILE%.*}
   echo "Extracting in ${DIR_NAME}"
   # Test if the directory exists, if not then create it
   [ -d ${DIR_NAME} ] || mkdir ${DIR_NAME}
   # Extract to the directory instead of cwd
   tar xzvf ${TAR_FILE} -C ${DIR_NAME}
else
   # Extract to cwd
   tar xzvf ${TAR_FILE}
fi

В некоторых случаях файл tar может содержать разные каталоги. Если вас раздражает поиск разных каталогов, извлеченных одним и тем же tar-файлом, сценарий можно изменить, чтобы создать новый каталог, даже если список содержит разные каталоги. Немного продвинутый образец выглядит следующим образом:

TAR_FILE=<some_tar_file_to_be_extracted>
# List the files in the .tgz file using tar -tf
# Look for only directory names using cut, 
# Current cut option used lists each files as different entry 
# Count the number unique directories, if the count is > 1, create directory
if [ `tar -tf ${TAR_FILE} |cut -d '/' -f 1|uniq|wc -l` -gt 1 ];then
   echo "Found file(s) which is(are) not in same directory"
   # Directory name will be the tar file name excluding everything after last "."
   # Thus "test.a.sh.tgz" will give a directory name "test.a.sh"
   DIR_NAME=${TAR_FILE%.*}
   echo "Extracting in ${DIR_NAME}"
   # Test if the directory exists, if not then create it
   # If directory exists prompt user to enter directory to extract to
   # It can be a new or existing directory
   if [ -d ${DIR_NAME} ];then
     echo "${DIR_NAME} exists. Enter (new/existing) directory to extract to"
     read NEW_DIR_NAME
     # Test if the user entered directory exists, if not then create it
     [ -d ${NEW_DIR_NAME} ] || mkdir ${NEW_DIR_NAME}
   else
     mkdir ${DIR_NAME}
   fi
   # Extract to the directory instead of cwd
   tar xzvf ${TAR_FILE} -C ${DIR_NAME}
else
   # Extract to cwd
   tar xzvf ${TAR_FILE}
fi

Надеюсь, это поможет!

...