Ответы:
Из каталога чуть выше 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
, но в OP не указано, что следует делать в таком случае. Это также потерпит неудачу в, по общему признанию маловероятном случае, когда один из $i
s содержит символ новой строки.
Вы можете достичь этого с помощью одного find
звонка.
find . -name 'Photo' -prune -o -type d -exec mkdir {}/Photo \;
Часть -name 'Photo' -prune -o
говорит не возвращаться к существующим (и вновь созданным) Photo
каталогам: если найденный файл (или каталог) имеет имя Photo
, прекратите его обработку ( -prune
). В другом случае ( -o
) продолжайте с directoryies ( -type d
) и execute ( -exec
) командой.
-prune
? :) Да, это довольно нелогично, но стоит учиться.
-type d
вместе с -name 'Photo'
before -prune
.
find
продолжит работу с другими папками (включая подпапки этой папки, если вы об этом просите).
Вы можете передать find
результаты while
вместо, for
так как таким образом он не сломается, если имена файлов имеют пробелы
Сначала перейдите в каталог 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
качестве части commanline, чтобы избежать легко допущенной ошибки. Таким образом, если он случайно запущен не из того места, он не будет создавать каталоги.
F1
Вместо этого я предлагаю сделать это отредактировано @LDJames
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 'import os; [os.mkdir (r + "/ Pictures") для r, d, f в os.walk (".")]'
Здесь мы просто вызываем интерпретатор python с -c
флагом, чтобы указать команду, которую мы даем в одинарных кавычках. os.walk()
Функция позволяет нам рекурсивно шагать по всем подкаталогам, и для каждого подкаталога (представленного r
) мы создаем папку Pictures через os.mkdir()
функцию. r+"/Pictures"
это просто простое манипулирование строкой для объединения строки подкаталога и строки "/ Pictures" в один путь
Замените "/ Pictures" на "/ Photo", чтобы соответствовать вашим требованиям
Если вы используете 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. Вы не указали, что следует делать в этих случаях, и все остальные ответы, опубликованные до сих пор, также имеют это ограничение.