Сценарий оболочки для создания каталогов - PullRequest
0 голосов
/ 23 июня 2011

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

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

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

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

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

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

Ответы [ 7 ]

3 голосов
/ 23 июня 2011

Если текущий каталог v_79, вы можете использовать комбинацию find и xargs:

find . -name 'ENSG00000......' -type d | xargs -I DIR mkdir DIR/my_dir 
2 голосов
/ 23 июня 2011

, если ваш текущий каталог содержит каталог "v_79", то

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

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

2 голосов
/ 23 июня 2011
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 рекурсивно создадут все необходимые каталоги.

1 голос
/ 23 июня 2011

это для 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" (например, в вашем профиле)

Если у вас слишком много каталогов, вы можете получить ошибку «список аргументов слишком длинный» (для 1-го эха). В этом случае решение с 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

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

1 голос
/ 23 июня 2011

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

for i in `find . -type d -name "ENSG00000??????"`; do mkdir $i/my_dir; done
0 голосов
/ 23 июня 2011

Вы хотите

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
0 голосов
/ 23 июня 2011

Просто добавьте опцию -p, и ваша работа будет завершена.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...