Как скопировать структуру папок и сделать символьные ссылки на файлы?

Могла быть аппаратная проблема: карта не полностью усажена, Вы не включили кабеля (питание, и т.д.), карта является дефектной, слот является дефектным, в слоте существует немного пыли.

21
26.07.2016, 20:20
8 ответов

Что-то вроде этого сделает то, что вам нужно.

#!/bin/bash
#
SOURCE="$1" COPY="$2"
cd "$SOURCE"
find . |
    sed 's!^\./!!' |
    while IFS= read ITEM
    do
        test -d "$ITEM" && { mkdir -p "$COPY/$ITEM"; continue; }
        BASE="${FILE%\/*}"
        ( cd "$COPY/$BASE" && ln -s "$SOURCE/$ITEM" )
    done

Каталоги созданы в целевой копии дерева. Все остальное называется обратно к абсолютному пути внутри исходного дерева. Убедитесь, что оба источника и копии указаны как абсолютные пути (начиная с / ).

Если у вас есть большое дерево для копирования, и вы хотите, чтобы отчетный отчет о выполнении для каждого каталога вы можете добавить ECHO «item»> & 2; непосредственно перед командой mkdir .

(Я посмотрел CP и и CPIO , но не имеет возможности для связи с источником с символическими ссылками.)

-121--21211-

Вот решение на не встроенном Linux и Cygwin:

cp -as SOURCE/ COPY

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

cp -as "$(pwd)/SOURCE/" COPY
27
27.01.2020, 19:43

Если в источнике нет пустых дирижений, которые необходимо скопировать

find /full/path/to/SOURCE -type f -exec cp -t COPY --parents -s {} +
mv COPY/full/path/to/SOURCE COPY
rm -r COPY/full
0
27.01.2020, 19:43

Я бы начал с разбивания файла Perl:

#!/usr/bin/perl

use strict;
use warnings;
use File::Find;

my $src_dir = "/full_path/to/dir";
my $tgt_dir = "/path/to/new/location";

sub link_or_mkdir {

    #current file is directory
    if (-d) {
        #extract the path
        my $newpath = $File::Find::dir;
        #change the path so 'old' and 'new' are swapped
        $newpath =~ s,^$src_dir,$tgt_dir,g;
        #print the command to make a new dir (doesn't actually do it)
        print "mkdir -p $newpath\n";
    }
    if (-f) {
        my $new_file = $File::Find::name;
        #change the path so 'old' and 'new' are swapped
        $new_file =~ s,^$src_dir,$tgt_dir,g;
        #print the symlink command
        print "ln -s $File::Find::name $new_file\n";
    }
}

find( \&link_or_mkdir, $tgt_dir );

: : Найти - это полезный модуль, который позволяет вам запустить определенный подпрограмм в любом файле в каталоге дерева. В этом случае подпункты проверьте, если это каталог - и если оно есть, делает MKDIR или файл - в этом случае он делает SymLink.

0
27.01.2020, 19:43

Можно попробовать пару таких команд поиска:

mkdir FULL-PATH-TO-COPY
cd SOURCE
find . \( ! -regex '\.' \) -type d -exec mkdir FULL-PATH-TO-COPY/{} \;
find * -type f -exec ln -s `pwd`/{} FULL-PATH-TO-COPY/{} \;
2
27.01.2020, 19:43

Если строка всегда имеет именно такую структуру, чтение может быть выполнено в одной строке без внешних процессов:

read x x x x level x x x x x x grid x x boxes x x tasks x <<<"$line"

(также с использованием herestring ). Это позволит сохранить все слова, которые вас не волнуют, в x (которые будут игнорироваться) и значения, которые вы хотите включить в их соответствующие переменные.

-121--47371-

Использование awk:

awk '{print "level="$5"\n""grid="$12"\n""boxes="$15"\n""tasks="$18}' file     
level=512^3
grid=16^3
boxes=32^3
tasks=800
-121--47369-

Похоже, вы ищете что-то вроде инструмента rsnapshot ; он создает копии произвольных каталогов и по возможности использует жесткие ссылки. (Посмотрите на страницу человека, чтобы узнать, подходит ли это.)

-1
27.01.2020, 19:43

Что-то вроде этого сделает то, что вам нужно.

#!/bin/bash
#
SOURCE="$1" COPY="$2"
cd "$SOURCE"
find . |
    sed 's!^\./!!' |
    while IFS= read ITEM
    do
        test -d "$ITEM" && { mkdir -p "$COPY/$ITEM"; continue; }
        BASE="${FILE%\/*}"
        ( cd "$COPY/$BASE" && ln -s "$SOURCE/$ITEM" )
    done

Директории создаются в целевом дереве COPY. Все остальное синхронно связано с абсолютным путем в дереве ИСТОЧНИКА. Убедитесь, что и ИСТОК и КОПИ указаны как абсолютные пути (начиная с /).

Если у вас есть большое дерево для копирования, и вы хотите получить отчет о прогрессе для каждого каталога, вы можете добавить эхо "$ITEM" >&2; непосредственно перед командой mkdir.

(Я посмотрел на cp и cpio, но, похоже, ни у одного из них нет возможности связать источник с символическими ссылками)

.
1
27.01.2020, 19:43

Существует как минимум 2 стандартные утилиты для построения теневого дерева каталогов существующего дерева, поэтому писать здесь код не нужно.

Сначала идет lndir (1) из пакета xutils-dev . Он использует символические ссылки на файлы. На странице руководства:

NAME
   lndir  -  create a shadow directory of symbolic links to another
             directory tree
SYNOPSIS
   lndir [ -silent ] [ -ignorelinks ] [ -withrevinfo ] fromdir [ todir ]

Возможно, лучшая альтернатива - просто использовать cp с правильными параметрами, как предлагает принятый ответ. Я просто дам еще несколько, надеюсь, полезных деталей:

cp -al /src/dir /dest/dir    # hard-links to leaf-files
cp -as /src/dir /dest/dir    # symlinks to leaf-files

Если вас не заботит сохранение всех атрибутов (владения / разрешения, время), замените параметр на (эквивалент -dr - -preserve = all ) с r (только рекурсивный):

cp -rl /src/dir /dest/dir    # hard-links to leaf-files
cp -rs /src/dir /dest/dir    # symlinks to leaf-files
6
27.01.2020, 19:43

GNU shtoolпредоставляет такую ​​возможность:

shtool mkshadow srcdir destdir

Более того, если вы хотите сделать неглубокую копию исходного каталога в дереве сборки, вы можете распространять shtoolвместе с вашим исходным деревом, поскольку это переносимый сценарий оболочки (, который предоставляет множество других возможностей, которые вы могли бы использовать. заинтересоваться ).

0
14.09.2020, 09:56

Теги

Похожие вопросы