Создайте папку “Photo” во всех каталогах рекурсивно

У меня есть набор папок, и я хочу циклично выполниться по всем тем папкам, и в каждой папке создают другую папку, названную "фотографией"

F1
--F11
----F111
----F112
--F12

Я хочу иметь:

F1
--Photo
--F11
----Photo
----F111
------Photo
----F112
------Photo
--F12
----Photo
9
задан 14 September 2016 в 02:23

5 ответов

Из каталога чуть выше 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 к верхнему регистру.
  • Добавленная поддержка non-stander filesnames (с предложениями от Terdon).
8
ответ дан 16 November 2019 в 05:58

Можно достигнуть его с помощью сингла find вызов.

find . -name 'Photo' -prune -o -type d -exec mkdir {}/Photo \;

часть -name 'Photo' -prune -o говорит для не рекурсивного вызова к существующему (и недавно созданный) Photo каталоги: Если найденный файл (или каталог) имеет имя Photo, прекратите обрабатывать его (-prune). В другом случае (-o), продолжите каталоги (-type d) и выполнитесь (-exec) команда.

24
ответ дан 16 November 2019 в 05:58

Вы могли передать 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 для справки с этим :)

9
ответ дан 16 November 2019 в 05:58

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" просто управление простой строкой для присоединения к строке подкаталога и "/Изображения" строка вместе для формирования одного пути

Замена "/Изображения" с "/фотография" для соответствия требованиям

5
ответ дан 16 November 2019 в 05:58

При использовании удара можно просто работать:

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 подкаталог в целевом каталоге, который содержит файл , названный фотографией. Вы не указали то, что должно быть сделано в тех случаях, хотя и все другие ответы, отправленные до сих пор также, имеют это ограничение.

4
ответ дан 16 November 2019 в 05:58

Другие вопросы по тегам:

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