У меня есть набор папок, и я хочу циклично выполниться по всем тем папкам, и в каждой папке создают другую папку, названную "фотографией"
F1
--F11
----F111
----F112
--F12
Я хочу иметь:
F1
--Photo
--F11
----Photo
----F111
------Photo
----F112
------Photo
--F12
----Photo
Из каталога чуть выше F1 запускает этот скрипт:
цель сценария состоит в том, чтобы не создавать избыточные фото каталоги в соответствии с фото каталогами.
кроме того, это - дизайн для предотвращения случайно выполнения его от неправильного местоположения, такого как корневой каталог пользователя, тогда как это не видело бы F1
каталог и по ошибке создало бы сотни фото каталогов в неправильных дворцах.
кроме того, это были мои намерения сделать легкое для следования сценарию, таким образом, пользователь мог настроить его.
#!/bin/bash
while IFS= read -r -d '' i;
do
if [[ ! -d $i/Photo ]]; then
# Filter to skip folders named Photo
thisfolder="$(echo $i | sed "s/.*\///")"
if [[ ! $thisfolder == "Photo" ]]; then
mkdir "$i/Photo"
fi
fi
done < <(find F1 -type d -print0)
Обновленный Сценарий:
p
в photo
к верхнему регистру. Можно достигнуть его с помощью сингла find
вызов.
find . -name 'Photo' -prune -o -type d -exec mkdir {}/Photo \;
часть -name 'Photo' -prune -o
говорит для не рекурсивного вызова к существующему (и недавно созданный) Photo
каталоги: Если найденный файл (или каталог) имеет имя Photo
, прекратите обрабатывать его (-prune
). В другом случае (-o
), продолжите каталоги (-type d
) и выполнитесь (-exec
) команда.
Вы могли передать find
результаты while
вместо for
начиная с этого способа, которым это не повредится, если имена файлов будут иметь пробелы
Первый CD к каталогу F1
, то сделайте:
find -type d | while read dir ; do mkdir "$dir"/Photo ; done
, Если каталог существует, mkdir
, просто откажется создавать его, таким образом, без проблем там...
, Если Ваши имена каталогов могли бы содержать новые строки или другую экзотическую странность, используйте это, которое может иметь дело с произвольными именами:
find -type d -print0 | while IFS= read -r -d '' dir ; do mkdir "$dir"/Photo ; done
Благодаря @terdon для справки с этим :)
Python с os.walk
может сделать это довольно легко и только в нескольких строках кода
$ mkdir dir_one dir_two
$ mkdir dir_two/dir_three
$ python -c 'import os;[os.mkdir(r + "/Pictures") for r,d,f in os.walk(".")]'
$ tree
.
├── dir_one
│ └── Pictures
├── dir_two
│ ├── dir_three
│ │ └── Pictures
│ └── Pictures
└── Pictures
, С чем мы имеем дело, эта команда: Python-c 'импортирует OS; [os.mkdir (r + "/Изображения") для r, d, f в os.walk (". ")]'
Здесь мы просто называем интерпретатор Python с -c
флаг для определения команды, которую мы даем в одинарных кавычках. os.walk()
функция позволяет нам рекурсивно ступать через все подкаталоги, и для каждого подкаталога (представленный r
), мы создаем папку Pictures через os.mkdir()
функция. r+"/Pictures"
просто управление простой строкой для присоединения к строке подкаталога и "/Изображения" строка вместе для формирования одного пути
Замена "/Изображения" с "/фотография" для соответствия требованиям
При использовании удара можно просто работать:
shopt -s globstar
for d in **/; do mkdir -p "$d"/Photo; done
globstar
опция делает **
соответствие "все файлы и 0 или больше каталогов и подкаталоги". Другими словами, это соответствует всему рекурсивно. Из-за /
в конце, **/
будет соответствовать всем каталогам и подкаталогам (никакие файлы). Поэтому эти $d
выполнит итерации по всем каталогам в текущем каталоге и их подкаталогах и Photos
, каталог будет создан в каждом из них.
-p
флаг mkdir
средства:
-p, --parents
no error if existing, make parent directories as needed
Здесь, я просто использую его для подавления сообщений об ошибках, если целевой каталог уже существует. Удалите его, если Вы хотите видеть ошибки.
Примечание, которое это не создаст Photo
подкаталог в целевом каталоге, который содержит файл , названный фотографией. Вы не указали то, что должно быть сделано в тех случаях, хотя и все другие ответы, отправленные до сих пор также, имеют это ограничение.