2011-06-23 6 views
0

Я пытаюсь создать простой сценарий оболочки для рекурсивного создания каталогов внутри списка каталогов.Сценарий оболочки для создания каталогов

У меня есть следующая файловая структура: Каталог с именем v_79, содержащий список «dirs» (от dir_0 до dir_210), и внутри каждого из них имеется несколько каталогов ENSG00000 ??????, где '?' обозначает символ между [0-9].

Я хотел бы создать каталог под названием «my_dir» внутри каждого из ENSG00000 ????? каталоги.

Я знаю, как создать каталог однажды, находясь внутри каждого из dir_XX «s,

for i in ENSG00000??????; do mkdir $i/my_dir; done 

, но я не знаю, как создать каталог, что мне нужно, в каталоге v_79.

+1

Для этого требуется внешний цикл для перебора по структуре dir_0 в dir_210. – Lazarus

+2

Это невероятно большое количество каталогов для создания - 422 миллиона? dir_0 to dir_210 = 211 x ENSG00000000000 по ENSG00000999999 = 1 000 000 + еще один миллион для каталога my_dir, поэтому 2 миллиона на dir_n = 422 миллиона. Если вы не объяснили что-то не так, вы будете бороться за это в любой файловой системе. Или ENSG00000 ?????? уже существует? – Orbling

+2

«Я знаю, как создать каталог, когда-то внутри ...» - нет, я не думаю, что вы это делаете :-) Это будет только попытка создать каталоги, которые уже существуют. – paxdiablo

ответ

2

, если текущий каталог содержит каталог «v_79», затем

for dir in v_79/dir_{0..210}/ENSG00000??????; do mkdir $dir/my_dir; done 

Интересно, если что может привести к ошибке «слишком длинный список аргументов», и в этом случае find - это путь.

+0

Его идеальный, Гленн. Это сделало работу. Thx так много! – peixe

2
mkdir -p v_79/dir{0,1}{1,2,3} 

создаст каталоги V79/dir01, V79/dir02, V79/dir03, V79/dir11, V79/dir12 и V79/dir13 даже если v_79 не существует.

Параметры -p будут реорганизовать все требуемые каталоги.

+0

Это не создает каталоги 'my_dir' внутри' ENSG00000 ?????? 'каталогов. – mouviciel

+0

Каталоги dir_xx уже существуют; Мне не нужно создавать их, и, как сказал @mouviciel, он не создает каталог my_dir внутри. Thx в любом случае! – peixe

3

Если ток НАПРАВЛ v_79, вы можете использовать комбинацию find и xargs:

find . -name 'ENSG00000......' -type d | xargs -I DIR mkdir DIR/my_dir 
1

Вы можете сделать это из каталога v_79:

for i in `find . -type d -name "ENSG00000??????"`; do mkdir $i/my_dir; done 
+0

Это создаст каталоги под названием 'my_dir' внутри каталогов в текущем каталоге под названием' find', '-type',' d', '-name' и' ENSG00000 ?????? ', но только если эти каталоги уже существует. Вы хотели сказать «for i in $ (find. -type d -name« ENSG00000 ?????? »); do mkdir -i $ i/my_dir; done', но это также создаст только подкаталог, если родитель уже существует. – Sorpigal

+0

ой .. ты прав. Я просто забыл добавить «' ». – KSDaemon

0

Просто добавьте параметр -p, то ваша работа будет выполнена.

КСТАТИ: опция -p для команды MKDIR означает «нет ошибки, если существующие, сделать родительские каталоги по мере необходимости»

0

Вы хотите

mkdir v_79/dir_{0,1,2}{,0,1,2,3,4,5,6,7,8,9}{,0,1,2,3,4,5,6,7,8,9}/ENSG00000??????/my_dir 
1

это для dry run - удостоверившись, удалите эхо перед тем MKDIR

echo ./v_79/**/ENSG* | xargs -I% echo mkdir %/my_dir #or 
echo ./v_79/**/dir_*/ENSG* | xargs -I% echo mkdir %/my_dir 

вам нужно для этого bash4 и "shopt -s globstar" (например, в вашем профиле)

Если у вас слишком много каталогов, вы можете получить слишком длинную ошибку списка аргументов (для первого эха).В этом случае решение с find лучше

find v_79 -type d -print | grep '/ENSG' | xargs -I% echo mkdir %/my_dir 
  • найти все каталоги в v_79
  • отфильтровывать только они с именем ENSG (вы можете добавить больше «фильтры»)
  • бег (эхо) MkDir результата

находится где-то в пути может быть пространство, модифицировать выше:

find v_79 -type d -print0 | grep -z '/ENSG' | xargs -0 -I% echo mkdir %/my_dir 

Кроме того, вы можете ограничить глубину команды поиска и т.д .:

find v_79 -depth 2 -type d -print0 | grep -z '/ENSG' | xargs -0 -I% echo mkdir %/my_dir 

снова, все выше для сухого хода - удалить эхо для бега. ;)

+0

Я уже делал это с решением в первом ответе. :) В любом случае, я проголосую за ваше решение, потому что, поскольку я m newb, его всегда интересно решение с кодом, объясняемым как u did ...;) – peixe

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