Як створити каталог у всіх підкаталогах?


34

Припустимо, у мене така структура каталогів:

$ [~ / практика] лс
а Б В Г/

Тепер я хочу створити каталог tmp1у всіх підкаталогах practiceі я це роблю:

$ [~ / практика] mkdir * / tmp1
mkdir: не вдається створити каталог `* / tmp1 ': такого файлу чи каталогу немає

Потім я спробую -pперемикач, і я закінчую каталог із ім'ям *із підкаталогомtmp1

$ [~ / практика] mkdir -p * / tmp1

$ [~ / практика] лс
*/ а Б В Г/

Я знаю, що використання -pперемикача полягає у створенні декількох неіснуючих каталогів. Я просто думав, що це може допомогти.

Як створити одразу tmp1у всіх підкаталогах?

Якщо це може бути зроблено, як я його розширити для створення \tmp1, \tmp2, \tmp3в \a, \bі \cвідразу?

Змінити: Я пропустив згадка про те , що каталоги не повинні бути простими і в порядку, як a, b, і cт.д., і каталог буде створений не обов'язково , як tmp1, tmp2.

$ [~ / практика] лс
собака / кішка / щур /

В них я хотів би мати щось подібне

$ [~ / практика] ls *
пес:
червоний / синій /

кішка:
червоний / синій /

щур:
червоний / синій /

1
З огляду на відповідь Крістофера , вам слід уточнити, чи "створення \ tmp1, \ tmp2, \ tmp3 в \ a, \ b і \ c" має призвести до загальної кількості 3 або 9 підкаталогів.
манантська робота

@manatwork: Це хороший момент. Слід створити 9 підкаталогів.
Анімеш

Це моя допомога у вирішенні проблеми з простором у назві каталогу sudo find ./ -depth -type d -exec echo '"{} / RCS"' \;

Відповіді:


44

З глобусами :

for dir in */; do mkdir -- "$dir/tmp1"; done

ПРИМІТКА

  • Я поводжуся лише з дріром (включаючи символьні посилання на дрірс) з невеликим злом використання */як глобус
  • Якщо ви хочете створити кілька підкаталогів одночасно:

    for dir in */; do mkdir -- "$dir"/{tmp1,foo,bar,qux}; done


Чи можу я зробити for i in */; do mkdir "$i/itemone" "$i/itemtwo"; doneдля декількох імен каталогів, які не в порядку?
Анімеш

Я тестував це, і це дуже можливо. Спасибі.
Анімеш

Дивіться моє відредаговане повідомлення
Жилле Кінот

1
Розширення дужки не виконується в цитованому рядку.
манатство

Так, дякую, допис відповідно відредагував Стефан Шазелас ...
Жил Квенот

10

[...] як я розширюю його, щоб створити \ tmp1, \ tmp2, \ tmp3 в \ a, \ b і \ c відразу?

 mkdir {a,b,c}/tmp{1,2,3}

10

За допомогою GNU або BSD * знайдіть:

find -mindepth 1 -maxdepth 1 -type d -exec mkdir {}/newdir \;

або за допомогою розширення параметра:

dirs=(*/)
mkdir -- "${dirs[@]/%/newdir}"

* Включає ОС X


2
Зі стандартним синтаксисом знаходження:find . -name . -o -prune -type d -exec sh -c 'exec mkdir "$1/newdir"' sh {} \;
Стефан Шазелас

1
Також зверніть увагу на відмінності між двома рішеннями: перший включає приховані каталоги, другий додасть newdir у каталоги, пов'язані будь-яким символьним посиланням у поточному каталозі.
Стефан Шазелас

6

Поза темою, оскільки ви згадуєте bash, але для запису з zsh ви зробите:

dirs=(*(/))
mkdir -- $^dirs/tmp1

$^varвмикає брекет-подібне розширення для розширення масиву. Це нагадує оператора rc's ^та в rc(або його похідній es), ви напишете це:

dirs=(*/)
mkdir -- $dirs^tmp1

Однак зауважте (і те саме стосується баш-рішень, наведених тут), що в рішенні rc dirsтакож міститься символічні посилання на каталоги. У рішенні zsh змініть *(/)на, *(-/)якщо ви хочете включити посилання на каталоги.


+1 за вашу думку про символьні посилання! Така поведінка може бути бажаною, але скарга mkdir щодо створення дубліката каталогу може бути придушена -pпрапором.
kojiro

4

Портативно, переведіть петлю на батьківські каталоги:

for d in */; do mkdir "$d/red" "$d/blue"; done

Додати --після , mkdirякщо ви можете мати каталоги, імена яких починаються з -.

У zsh ви можете це зробити в одній команді з e класифікатором glob :

mkdir *(/e\''REPLY=($REPLY/{red,blue})'\')

але швидше набрати це як дві команди:

d=(*(/)); mkdir $^d/{red,blue}

1
На сайті, який повинен бути посиланням, я б краще сказати " mkdir -- whateverі опустити, -- якщо ви плануєте розширення будь-якого, що може бути прийнято як параметри для mkdirкоманди." Тут немає сенсу опускати --. У випадку з ОП це може не бути проблемою, але в загальному випадку це одна. Я думаю, що ми маємо обов’язок викладати правильний і безпечний синтаксис.
Стефан Шазелас

@StephaneChazelas У сценарії сценаріїв я завжди вказую всі необхідні --та цитати та великі жирні попередження, коли нові рядки не підтримуються. У контексті командного рядка я вважаю за краще показувати швидку версію, яка працює на практиці спочатку, і пуленепроникну версію як доповнення.
Жил "ТАК - перестань бути злим"


1

Варіант відповіді Sputnick, який дозволяє уникнути файлів, що не містять каталогів:

for x in *; do if [ -d "$x" ]; then mkdir "$x/tmp1"; fi; done

Я ставлюся лише до панів, у цьому все чари ...
Жилль Кінот

круто, отримав;)
золотинок

2
Чи не повинно бути це if [ -d "$x" ];…?
kojiro

Так. Я практично ніколи не маю пробілів у назви файлів і схильний забувати цей матеріал ...
goldilocks

1

Це хороший варіант із старих майстрів Unix (тестований на FreeBSD 10.1), якщо ви хочете керувати версією (при реєстрації RCS заблоковано: ci -l з коротким коментарем як ir: для початкового випуску) ваші / etc / * конфігураційні файли на ~ / .his / тощо

sudo rsync -av /etc/ ~/.his
sudo find -d ~/.his/etc -type d -exec echo '{}/RCS' \; | xargs sudo mkdir -p
sudo find -d ~/.his/etc \! -name "RCS" | xargs sudo ci -l -mir -t-ir

Я не бачу, як це відповідає ОП
Архемар

1

Має бути \! назва "RCS", і вона найкраще працює при першій реєстрації.

знайти sudo ~ / .his / тощо \! -назви "RCS" -лс

знайти sudo -d ~ / .his / тощо \! -назви "RCS" | xargs sudo ci -l -mir -t-ir

Цей останній також дуже добре працює для cjeck в частині фільтрації всього вмісту RCS на ім'я файлу:

sudo знайти -d ~ / .his / тощо -тип f | grep -v RCS | xargs sudo ci -l -mir -t-ir


1

це мені велика допомога. У мене була потреба створити набір підкаталогів у кількох папках і щось подібне:

!/bin/sh

cd /dest/cont

for dir in */*/; do
    mkdir -p -- $dir/{FB,Video,Audio,proj};
done

працював чудово, за винятком випадків, коли зустрічається пробіл. чи є спосіб ігнорувати пробіли в */*/частині аргументів?

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.