Відповіді:
З каталогу трохи вище 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
верхній регістр.ls
не розбирається. Це просто відгук для користувача ... показує, що відбувається. Як і слова "Це каталог фотографій". Це дозволяє користувачеві знати, чому він не створює там каталог.
find -type d F1
, можливо?
$i/Photo
, але ОП не вказав, що робити в такому випадку. Він також вийде з ладу у, мабуть, малоймовірному випадку, коли один із $i
s містить новий рядок.
Ви можете досягти цього за допомогою одного find
дзвінка.
find . -name 'Photo' -prune -o -type d -exec mkdir {}/Photo \;
Частина -name 'Photo' -prune -o
повідомляє не повторювати існуючі (і новостворені) Photo
каталоги: Якщо знайдений файл (або каталог) має ім'я Photo
, припиніть його обробку ( -prune
). В іншому випадку ( -o
) продовжуйте каталоги ( -type d
) та виконайте команду ( -exec
).
-prune
? :) Так, це досить контр-інтуїтивно, але варто вчитися.
-type d
разом із -name 'Photo'
раніше -prune
.
find
буде продовжено з іншими папками (включаючи вкладені папки цієї папки, якщо ви цього вимагаєте).
Ви можете передавати 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 за допомогу в цьому :)
F1
довідник ОП є ~user/Pictures
, переміщення до батьківського каталогу та запуску рядка помістить Photo
у кожен каталог у своєму просторі каталог, якого може бути тисячі. Розгляньте додавання F1
як частину комерційної лінії, щоб уникнути легко зробленої помилки. Таким чином, якщо він ненавмисно запускається з неправильного місця, він не створюватиме каталоги.
F1
замість цього, редагував @LDJames
Python with 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 'import os; [os.mkdir (r + "/ Pictures") для r, d, f в os.walk (".")]'
Тут ми просто викликаємо інтерпретатора python з -c
прапором, щоб вказати команду, яку ми даємо в межах однієї лапки. os.walk()
Функція дозволяє нам рекурсивно переходити через всі підкаталоги, і для кожного підкаталогу (представленого r
) ми створюємо папку Pictures за допомогою os.mkdir()
функції. r+"/Pictures"
це просто проста маніпуляція з рядком, щоб об'єднати рядок підкаталога та рядок "/ Pictures" разом, щоб утворити один шлях
Замініть "/ Картинки" на "/ Фото", щоб відповідати вашим вимогам
Якщо ви використовуєте bash, ви можете просто запустити:
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
підкаталог у цільовому каталозі, який містить файл з назвою Photo. Ви не вказали, що робити в цих випадках, хоча всі інші відповіді, розміщені дотепер, також мають це обмеження.