Вопрос по bash, whitespace, symlink – Скрипт Bash для автоматического создания символических ссылок на подкаталоги в дереве

3

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

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

Я пытаюсь создать простой сценарий оболочки, который находит все подкаталоги в определенном именованном подкаталоге в дереве и создает символические ссылки на эти каталоги (звучит более запутанно, чем сейчас). Я'Я использую 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 выкладывает длинный список всех каталогов, соединенных вместе (разделенных) и выдает "Имя файла слишком длинное ошибка.

Идеи ??

Ваш Ответ

3   ответа
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 null.

использование-name вместоgrep как в NWCoder'еответ, и вы можете использовать.-print0 Dennis Williamson
4

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

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

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

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

Используйте для цикла.

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

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

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

Ваша команда не будет выполнена, если один из найденных каталогов содержит пробелы. Вы должны добавить кавычки, т.е. <<ln -s "$ Имя» $ Todir >>, Это одно из больших преимуществ использования "xargs -0 " что вы избегаете всех таких проблем. hlovdal
Ах да, конечно. Надоедливые побеги. KFro

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