Могла быть аппаратная проблема: карта не полностью усажена, Вы не включили кабеля (питание, и т.д.), карта является дефектной, слот является дефектным, в слоте существует немного пыли.
Что-то вроде этого сделает то, что вам нужно.
#!/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
, но не имеет возможности для связи с источником с символическими ссылками.)
Вот решение на не встроенном Linux и Cygwin:
cp -as SOURCE/ COPY
Обратите внимание, что источник должен быть абсолютным путем и имеет конечную косулью. Если вы хотите дать относительный путь, вы можете использовать
cp -as "$(pwd)/SOURCE/" COPY
Если в источнике нет пустых дирижений, которые необходимо скопировать
find /full/path/to/SOURCE -type f -exec cp -t COPY --parents -s {} +
mv COPY/full/path/to/SOURCE COPY
rm -r COPY/full
Я бы начал с разбивания файла 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.
Можно попробовать пару таких команд поиска:
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/{} \;
Если строка всегда имеет именно такую структуру, чтение
может быть выполнено в одной строке без внешних процессов:
read x x x x level x x x x x x grid x x boxes x x tasks x <<<"$line"
(также с использованием herestring ). Это позволит сохранить все слова, которые вас не волнуют, в x
(которые будут игнорироваться) и значения, которые вы хотите включить в их соответствующие переменные.
Использование 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
; он создает копии произвольных каталогов и по возможности использует жесткие ссылки. (Посмотрите на страницу человека, чтобы узнать, подходит ли это.)
Что-то вроде этого сделает то, что вам нужно.
#!/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
, но, похоже, ни у одного из них нет возможности связать источник с символическими ссылками)
Существует как минимум 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
GNU shtool
предоставляет такую возможность:
shtool mkshadow srcdir destdir
Более того, если вы хотите сделать неглубокую копию исходного каталога в дереве сборки, вы можете распространять shtool
вместе с вашим исходным деревом, поскольку это переносимый сценарий оболочки (, который предоставляет множество других возможностей, которые вы могли бы использовать. заинтересоваться ).