Типичный путь состоит в том, чтобы использовать dd
. Вот инструкции от syslinux загрузчика для установки mbr.bin
кому: /dev/sda
.
dd bs=440 count=1 conv=notrunc if=mbr/mbr.bin of=/dev/sda
Здесь, /dev/sda
целевое устройство. (of
"выходной файл".)
Вы заменили бы это именем устройства Вашей Карты памяти.
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 .. .
.
Хорошо, давайте сделаем это коротким :
ls -1|xargs -i% bash -c 'mkdir %/doc;>>%/doc/doc1.txt'
- Мы находимся на каталоге типа вашего стартового каталога.
ls -1
1 перечисляет 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, используйте ключ / для поиска "Переадресация вывода"
В 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 \;
, но, на самом деле, простой цикл имеет то преимущество, что он прост - и не более того!
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