Сделайте много подкаталогов сразу

Типичный путь состоит в том, чтобы использовать dd. Вот инструкции от syslinux загрузчика для установки mbr.bin кому: /dev/sda.

dd bs=440 count=1 conv=notrunc if=mbr/mbr.bin of=/dev/sda

Здесь, /dev/sda целевое устройство. (of "выходной файл".)

Вы заменили бы это именем устройства Вашей Карты памяти.

4
04.08.2014, 23:12
4 ответа

С zsh :

dirs=(*(/))
mkdir -- $^dirs/doc
touch -- $^dirs/doc/doc1.txt

(/) - квалификатор подстановки , / означает только выбор каталоги.

$ ^ array (напоминает оператор ^ в rc ]) предназначен для включения фигурного типа раскрытия массива, поэтому $ ^ array / doc похож на {elt1, elt2, elt3} / doc (где elt1 , elt2 , elt3 - элементы массива).

Можно также сделать:

mkdir -- *(/e:REPLY+=/doc:)
touch -- */doc(/e:REPLY+=/doc1.txt:)

Где e - еще один квалификатор подстановки, который выполняет некоторый заданный код в файле для выбора.

С помощью rc / es / akanga :

dirs = */
mkdir -- $dirs^doc
touch -- $dirs^doc/doc1.txt

Это использование оператора ^ , который похож на расширенный оператор конкатенации.

rc не поддерживает квалификаторы подстановки (это функция только для zsh). * / расширяется на все каталоги и символические ссылки на каталоги с добавлением / .

С tcsh :

set dirs = */
mkdir -- $dirs:gs:/:/doc::q
touch -- $dirs:gs:/:/doc/doc1.txt::q

: x - это модификаторы истории, которые также можно применять к расширению переменных. : gs - глобальная замена. : q цитирует слова, чтобы избежать проблем с некоторыми символами.

С zsh или bash :

dirs=(*/)
mkdir -- "${dirs[@]/%/doc}"
touch -- "${dirs[@]/%/doc/doc1.txt}"

$ {var / pattern / replace} - это оператор замены в оболочках типа Korn. С помощью $ {array [@] / pattern / replace} он применяется к каждому элементу массива. % означает в конце .

Различные соображения:

dirs = (* /) включает каталоги и символические ссылки на каталоги (и нет другого способа исключить символические ссылки, кроме использования [-L "$ file"] в цикл), а dir = (* (/)) (расширение zsh) включает только каталоги ( dir = (* (- /)) для включения символических ссылок на каталоги без добавления завершающая косая черта).

Они исключают скрытые каталоги. Каждая оболочка имеет особую возможность включать скрытые файлы).

Если текущий каталог доступен для записи другим пользователям, у вас могут быть проблемы с безопасностью. Так же можно создать там символическую ссылку, чтобы заставить вас создавать каталоги или файлы там, где вы не хотели бы этого делать. Даже с решениями, которые не учитывают символические ссылки, все еще существует состояние гонки, поскольку можно заменить каталог символической ссылкой между dirs = (* /) и mkdir .. . .

7
27.01.2020, 20:46

Хорошо, давайте сделаем это коротким :

ls -1|xargs -i% bash -c 'mkdir %/doc;>>%/doc/doc1.txt'


- Мы находимся на каталоге типа вашего стартового каталога.

  • ls -11 перечисляет herdir и т.д., по одному на строку (больше ничего)

  • xarg запускает оболочку с аргументом скрипта, заменяя % на каталог

  • Для каждого каталога:

    • bash запускает в качестве скрипта shell один аргумент строки, содержащий две команды

      • mkdir %/doc, создающие каталог
      • >>%/doc/doc1.txt, создающий пустой файл2


$ ls
$ mkdir mydir hisdir herdir
$ ls                       
herdir  hisdir  mydir
$ ls -1|xargs -i% bash -c 'mkdir %/doc;>>%/doc/doc1.txt'
$ find
.
./herdir
./herdir/doc
./herdir/doc/doc1.txt
./hisdir
./hisdir/doc
./hisdir/doc/doc1.txt
./mydir
./mydir/doc
./mydir/doc/doc1.txt



1) Художественная свобода; найти. -maxdepth 1 -type d

2) >> file создает здесь пустой файл, похожий на сенсорный. Это bash спецификация, см. man bash, используйте ключ / для поиска "Переадресация вывода"

0
27.01.2020, 20:46

В bash используйте что-то вроде этих строк:

mkdir -p {mydir,hisdir,herdir}/doc
touch {mydir,hisdir,herdir}/doc/doc1.txt

Синтаксис {...} называется «раскрытием фигурных скобок», и в отличие от расширения имени пути , где имя файла должно существуют, сгенерированные результаты не обязательно должны совпадать с чем-либо, что уже существует. И -p означает создание всех вложенных компонентов пути по мере необходимости - в противном случае вы получите сообщение об ошибке, поскольку mkdir попытается создать окончательные каталоги «doc» перед родителями.

(Ознакомьтесь с примерами на странице руководства bash; создание подобных подкаталогов является обычным вариантом использования.)

Если mydir, hisdor и herdir уже существуют, и вы не хотите их вводить повторно, то можно использовать Stéphane Chazelas's решение, вероятно, является самым умным, но если вы не делаете это все время, умный не всегда лучший - я никогда не могу вспомнить, что такое расширение массива bash, и держу пари, что многие младшие системные администраторы не узнают его. В этом случае, я думаю, я бы порекомендовал либо цикл, либо find , например:

find . -maxdepth 1 -mindepth 1 -type d \
   -execdir mkdir {}/doc \; -execdir touch {}/doc/doc1.txt \;

, но, на самом деле, простой цикл имеет то преимущество, что он прост - и не более того!

8
27.01.2020, 20:46
for d in /*/
do  [ -d "$d" ] || break
    f=$d/docs/doc1.txt    
    mkdir -p -- "${f%/*}"
    touch -- "$f"
done

Я думаю, что это соответствует вашим целям. Может быть, я что-то упускаю.

Иначе вы можете:

set -- /*/
[ -d "$1" ] && 
printf 'd=$%d
    mkdir -p -- "$d/docs" && 
    touch -- "$d/docs/doc1.txt"
' $(seq "$#") | sh -s -- "$@"

или:

set -- /*/
while [ -d "$1" ] 
do  mkdir -p -- "$1"/docs
    touch -- "$1"/docs/doc1.txt
shift ; done
0
27.01.2020, 20:46

Теги

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