Вот возможность, которая возьмет извлеченные файлы и переместит их в подкаталог, очистив основную папку.
#!/usr/bin/perl -w
use strict;
use Getopt::Long;
my $clean_folder = "clean";
my $DRY_RUN;
die "Usage: $0 [--dry] [--clean=dir-name]\n"
if ( !GetOptions("dry!" => \$DRY_RUN,
"clean=s" => \$clean_folder));
# Protect the 'clean_folder' string from shell substitution
$clean_folder =~ s/'/'\\''/g;
# Process the "tar tv" listing and output a shell script.
print "#!/bin/sh\n" if ( !$DRY_RUN );
while (<>)
{
chomp;
# Strip out permissions string and the directory entry from the 'tar' list
my $perms = substr($_, 0, 10);
my $dirent = substr($_, 48);
# Drop entries that are in subdirectories
next if ( $dirent =~ m:/.: );
# If we're in "dry run" mode, just list the permissions and the directory
# entries.
#
if ( $DRY_RUN )
{
print "$perms|$dirent\n";
next;
}
# Emit the shell code to clean up the folder
$dirent =~ s/'/'\\''/g;
print "mv -i '$dirent' '$clean_folder'/.\n";
}
Сохраните это в файл fix-tar.pl
а затем выполните его так:
$ tar tvf myarchive.tar | perl fix-tar.pl --dry
Это подтвердит, что ваш список tar
похож на мой. Вы должны получить вывод как:
-rw-rw-r--|batch
-rw-rw-r--|book-report.png
-rwx------|CaseReports.png
-rw-rw-r--|caseTree.png
-rw-rw-r--|tree.png
drwxrwxr-x|sample/
Если это выглядит хорошо, запустите его снова так:
$ mkdir cleanup
$ tar tvf myarchive.tar | perl fix-tar.pl --clean=cleanup > fixup.sh
Сценарий fixup.sh
будет представлять собой команды оболочки, которые будут перемещать файлы и каталоги верхнего уровня в "чистую" папку (в данном случае это папка с именем cleanup
). Посмотрите этот скрипт, чтобы убедиться, что он кошерный. Если это так, теперь вы можете убрать беспорядок с помощью:
$ sh fixup.sh
Я предпочитаю такую очистку, потому что она не уничтожает ничего, что еще не было уничтожено перезаписью этой первоначальной tar xv
.
Примечание: если этот исходный результат пробного прогона не выглядит правильным, вы должны иметь возможность играть с числами в двух вызовах функции substr
пока они не будут выглядеть правильно. Переменная $perms
используется только для пробного прогона, поэтому в действительности должна быть правильной только подстрока $dirent
.
Еще одна вещь: вам может понадобиться использовать опцию tar
--numeric-owner
если имена пользователей и / или имена групп в списке tar
приводят к тому, что имена начинаются в непредсказуемом столбце.