Скрипт Bash для автоматического создания символических ссылок на подкаталоги в дереве - PullRequest
3 голосов
/ 26 августа 2009

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

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

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

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

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

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

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

К сожалению, ln выдает длинный список всех каталогов, соединенных вместе (разделенных \ n), и выдает ошибку «File name too long».

Идеи ??

Ответы [ 3 ]

4 голосов
/ 26 августа 2009

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

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

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

1 голос
/ 26 августа 2009

Используйте цикл for.

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

Xargs имеет проблемы, когда ввод из канала идет в конце команды. Вам нужны несколько команд, а не только одна команда.

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

1 голос
/ 26 августа 2009

ваша команда

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

имеет аргумент "-0" для xargs, но вы не указали find для "-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 null.

...