Список аргументов слишком длинный и копируется в Samba. Поделиться

Ubuntu 12.04 LTS 64 бит.

Я пытаюсь скопировать запланированное задание из каталога с тысячами файлов на общий ресурс samba (при этом пропуская дубликаты). Я отобразил свой общий ресурс Samba через графический интерфейс.

Команда, которую я пробовал:

cp / home / security / Brick / * ~ / .gvfs / "cam on atm-bak-01.local / Brick" -n

Я нашел это, но я не знаю, как изменить синтаксис на то, что мне нужно.

find -maxdepth 1 -name '* .prj' -exec mv -t ../prjshp {} +

Любые советы приветствуются.

1
задан 11 November 2013 в 19:05

1 ответ

Проблема в том, что оболочка расширяет ваш /home/security/Brick/* длинным (слишком длинным) списком файлов перед тем, как передает его в cp.

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

cp -rn /home/security/Brick ~/.gvfs/"cam on atm-bak-01.local"/

с использованием флага «рекурсивный» в cp. Это также скопирует всю структуру в Brick (включая подкаталоги).

Одна возможность - использовать цикл for:

for file in /home/security/Brick/*; 
do
cp -n $file ~/.gvfs/"cam on atm-bak-01.local/Brick"
done

Или использовать find:

find /home/security/Brick/ -type f -exec cp -n {} ~/.gvfs/"cam on atm-bak-01.local/Brick" \;

В этой команде -type f говорит, что нужно выбирать только файлы (без каталогов), затем для каждого файла выполняет указанную команду: {} заменяется именем файла, а \; - точка с запятой, необходимая для закрытия предложения -exec, экранируется, иначе оболочка его интерпретирует (и удаляет) ).

Команда после -exec может быть любой, какой вы хотите (например, вместо cp -n вы можете использовать cp -av для копирования в режиме архива (включая метки времени и правильность) и перезаписи, или вы можете использовать другие команды (, но : вы должны понимать экранирование оболочки, подстановку и цитирование раньше, в противном случае вы можете причинить много вреда - см., например, «изучение оболочки» ).

Find - очень мощная команда - ее стоит хорошо изучить. Я нашел интересные уроки здесь , здесь и здесь .

О создании резервной копии с помощью cp -n:

Обратите внимание, что флаг -n не будет перезаписывать существующие файлы, поэтому, если вы сделаете изменения файла в локальном каталоге, который был скопирован ранее не будет копироваться снова ... и у вас будет в резервной копии его старая версия.

По этой причине я рекомендую использовать утилиту резервного копирования или синхронизации, например Unison или rsync , чтобы сделать это орк. Эти утилиты просто обновят измененные файлы, могут минимизировать количество операций записи (и, следовательно, пропускную способность сети), и, как правило, намного безопаснее. Резервное копирование может быть решено с помощью rsync, просто сказав:

rsync -azvv  /home/security/Brick   ~/.gvfs/"cam on atm-bak-01.local/Brick"

(будьте осторожны, не добавляйте финальный символ "/" в конце --- или rsync создаст подкаталог Brick / Brick. Да , rsync является мощным и довольно темпераментным.)

У Unison есть хороший графический интерфейс, и он также скажет вам, есть ли конфликтующие изменения в вашем хранилище - так что это будет мой предпочтительный вариант. [+1139]

0
ответ дан 11 November 2013 в 19:05
  • 1
    @Tim раз так я couldn' t выясняют как. $ {$ {N %?}:-0} работает в zsh, но не в ударе или ksh. (Кроме того, :- в моем комментарии выше должен был быть :-0} – Random832 9 May 2015 в 21:02

Другие вопросы по тегам:

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