2009-08-25 9 views
3

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

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

Я пытаюсь создать простой скрипт, который находит все подкаталоги под определенным именем поддиректории в дереве и создает символические ссылки на эти каталоги (звучит более запутанно, чем есть). Я использую cygwin в Windows XP.

Эта находка/команда Grep находит каталоги в файловой системе, как я хочу его:

find -mindepth 3 -maxdepth 3 -type d | grep "New Parts" 

Теперь для жесткой части ... Я просто хочу, чтобы сделать этот список, конвейер в ЛУ и создать некоторые символические ссылки. Список каталогов имеет некоторые пробелы, так что я пытался использовать xargs, чтобы очистить вещи немного:

find -mindepth 3 -maxdepth 3 -type d | grep "New Parts" | xargs -0 ln -s -t /cygdrive/c/Views 

К сожалению, пер выплевывает длинный список всех каталогов сцепленных вместе (разделённых \ п) и выливает ошибку «Имя файла слишком долго».

Идеи ??

ответ

4

Я думаю, вы можете сделать все это в своей команде find. OTTOMH:

find -mindepth 3 -maxdepth 3 -type d -name "*New Parts*" -exec ln -s -t /cygdrive/c/Views {} \; 

Надеюсь, что я вспомнил этот синтаксис справа.

+1

+1 для флага -exec. Люди, похоже, часто забывают об этом. Вы можете захотеть заключить {} в кавычки, хотя он обрабатывает имена с пробелами в них в порядке. –

1

ваша команда

find -mindepth 3 -maxdepth 3 -type d | grep "New Parts" | xargs -0 ln -s -t /cygdrive/c/Views 

есть аргумент «-0» в xargs, но вы не сказали найти в «-print0» (если вы сделали Grep не мог работать в трубе между ними). То, что вы хотите, состоит в следующем, я предполагаю:

find -mindepth 3 -maxdepth 3 -type d | grep "New Parts" | tr '\012' '\000' | xargs -0 ln -s -t /cygdrive/c/Views 

Команда tr преобразует пустые строки в ASCII нуль.

+1

Используйте '-name' вместо' grep', как в ответе NWCoder, и вы можете использовать '-print0'. –

1

Используйте петлю для петли.

for name in $(find $from_dir -mindepth 3 -maxdepth 3 -type d); do 
    ln -s $name $to_dir 
done 

У Xargs есть проблемы, когда входной сигнал от трубы идет в конце команды. То, что вы хотите, это несколько команд, а не только одна команда.

Мой опыт работы с элементами команды find иногда может быть медленным, хотя он выполняет свою работу.

+0

Ваша команда не будет работать, если один из найденных каталогов содержит пробелы. Вы должны добавить кавычки, т. Е. << ln -s "$ name" $ ​​todir >>. Это одно из больших преимуществ использования «xargs -0», которое позволяет избежать всех таких проблем. – hlovdal

+0

Ах да, конечно. Досадные маленькие проблемы. – KFro

 Смежные вопросы

  • Нет связанных вопросов^_^