Rsync с помощью команды find, удалить оригинал, заменить оригинал символической ссылкой - PullRequest
3 голосов
/ 26 ноября 2011

Я работаю в графической компании, и наши клиенты предоставляют огромные объемы данных.Одна папка проекта может занимать сотни гигабайт пространства на нашем сервере.Хотя пространство на моем подключенном RAID-массиве ограничено 10 ТБ, у меня есть сервер хранения 96 ТБ, подключенный к моему главному серверу через iSCSI.

Я недостаточно разбираюсь в сценариях BASH, чтобы автоматизировать этот процесс, но что я делаювручную выполнить поиск с помощью этой команды:

find /disk -type d -name 09\ Client-Files | sed 's/ /\\ /g' > client-origs.txt

Из этого списка я пересылаю каталог «09 Client-Files» на сервер хранения, используя:

rsync -avR /disk/Client-Jobs/1234\ Client/09\ Client-Files /iscsi

С помощью -Rопция копирует относительный путь в /iscsi.

После этого удаляется исходный каталог «09 Client-Files» и символическая ссылка, указывающая на его новое расположение на томе / iscsi.

ЧтоЯ пытаюсь использовать найденный путь как переменную, чтобы делать все сразу.Я действительно в недоумении, как поступить.Я уже несколько дней пытаюсь научиться работать с переменными bash - я могу заставить их работать над более простыми вещами, но в этом случае у меня ничего не получается.Вы можете помочь брату?

Ответы [ 2 ]

1 голос
/ 26 ноября 2011

вы смотрели на команду lndir? (возможно, потребуется установить отдельно)

Создает теневой каталог символических ссылок, указывающих на другое дерево каталогов.

0 голосов
/ 26 ноября 2011

Вы можете сделать все это одновременно с помощью команды find:

find /usr -type d -name My\ Files -exec rsync -avR '{}' /iscsi \;

Для получения дополнительной информации man find, прямо перед концом есть несколько примеров. В качестве альтернативы вы можете передать результаты с помощью утилиты xargs.

Тебе следует изучить свои руководства более тщательно, здесь можно найти много сокровищ.

В сценарии bash вы также можете указать:

export MIVARIABLE=$(find /usr -type d -name My\ files)

, а затем

for i in $MIVARIABLE ;do
   rsync -avR $i /iscsi;
done

Но это имеет недостатки среди них, если ваши результаты очень большие, они могут превышать максимальное текстовое пространство bash, доступное для переменной, и если найденные имена содержат пробелы, некоторые утилиты могут сойти с ума.

В современной системе максимальный размер переменной среды bash может составлять от 8 КБ до почти 2 МБ, если вы добавите слишком много информации о переменной, вы получите ошибку Argument list too long.

Поэтому, если вам нужно перебрать список файлов / каталогов, лучше использовать встроенные функции find или в сотрудничестве с xargs. Внимательно прочитайте их руководства и попробуйте некоторые пробные прогоны, используя вместо этого echo your_command_line, чтобы вы приобрели соответствующий опыт и уверенность в работе коммунальных служб. Ищите функцию -print0 в find, а также команду -0 в xargs, которые разработаны, чтобы избежать некоторых проблем с именами файлов с пробелами и символами в их именах.

EDIT: find будет корректно обрабатывать пробелы с помощью оператора -exec:

find /usr -type d -name My\ Files -exec rsync -avR '{}' /iscsi \;  -exec rm -rf '{}'\;

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

Edit2:

find /usr -type d -name 'My Files' -exec rsync -avR '{}' /iscsi \;  -exec rm -rf '{}'\;

funciona igual que el ejemplo de arriba. Cuando bash lee «Мои файлы», он занимает все слово вместе и по-разному не обрабатывает пробелы

...