Как заменить обратную косую черту из файлов, отформатированных в Windows, в формат * nix и восстановить структуру - PullRequest
1 голос
/ 06 января 2011

У меня есть несколько файлов, которые были извлечены из zip-файла, созданного странным образом.

файлы вышли из tar.gz в формате файловой структуры Windows

Пример:

jpg_250 \ MI \ 00 \ 00 \ 00 \ 19 \ MI0000001900.jpg

против

jpg_250 / MI / 00/00/00/19 / MI0000001900.jpg

Первый вид рассматривается Linux как отдельный файл.

Я играл с awk и sed, чтобы разграничить имя файла с помощью обратной косой черты, создать соответствующие каталоги в правильной структуре и, наконец, переименовать файл в MI ** .jpg и переместите его в правильный вновь созданный конечный каталог.

Является ли awk и sed подходить сюда? У меня есть awk, который разбивает имя файла на нужные мне «каталоги», но у меня возникают проблемы с созданием каталогов. Я предполагаю, что мне понадобится sed в конце, чтобы переименовать файл в формате MI ** .jpg.

Большое спасибо за любую помощь.

Ответы [ 2 ]

3 голосов
/ 06 января 2011

Как то так?

$ ls 
a\b\c
a\b\d

$ for i in *; do
    F=$(echo $i | sed 's,\\,/,g')
    D=$(dirname $F)
    echo mkdir -p ${D}
    echo cp "${i}" "${F}"
done

mkdir -p a/b
cp a\b\c a/b/c
mkdir -p a/b
cp a\b\d a/b/d
0 голосов
/ 06 января 2011

Вы можете сделать это с помощью Perl следующим образом.

# assume that the script was called like this:
# myscript file1 file2 etc...
# then all the files are in @ARGV

foreach $orig (@ARGV) {
    $orig_fixed = $orig;

    # convert the \ to /
    $orig_fixed =~ s!\\!/!g;

    #split the filename into directory and filename 
    ($dir, $filename) = ($orig_fixed =~ m!^(.*)/([^/]*)$!);

    # create the directory if it doesn't exist
    if (!-e $dir) {
        `mkdir -p $dir`; # -p means create the full path
    }

    # now move the file
    `mv '$orig' $dir/$filename`;

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...