У меня есть несколько папок, и я хочу перебрать все эти папки и в каждой папке создать другую папку с именем «Фото»
F1
--F11
----F111
----F112
--F12
Я хочу иметь:
F1
--Photo
--F11
----Photo
----F111
------Photo
----F112
------Photo
--F12
----Photo
command-line
mkdir
OOzy Pal
источник
источник
ls
не анализируется. Это просто обратная связь с пользователем ... показывающая, что происходит. Так же, как слова "Это каталог фотографий". Он сообщает пользователю, почему он не создает каталог там.find -type d F1
, может быть?$i/Photo
, но в OP не указано, что следует делать в таком случае. Это также потерпит неудачу в, по общему признанию маловероятном случае, когда один из$i
s содержит символ новой строки.Вы можете достичь этого с помощью одного
find
звонка.Часть
-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
, затем выполните:Если каталог существует,
mkdir
просто откажется его создавать, поэтому проблем нет ...Если ваши имена каталогов могут содержать переводы строк или другую странную странность, используйте это, которое может иметь дело с произвольными именами:
Спасибо @terdon за помощь в этом :)
источник
F1
каталог операции есть~user/Pictures
, перемещение в родительский каталог и запуск строки поместитPhoto
каталог в каждый каталог в его пространстве, который может быть тысяч. Подумайте о добавлении вF1
качестве части commanline, чтобы избежать легко допущенной ошибки. Таким образом, если он случайно запущен не из того места, он не будет создавать каталоги.F1
Вместо этого я предлагаю сделать это отредактировано @LDJamesPython с
os.walk
может сделать это довольно легко и всего за несколько строк кодаобъяснение
Мы имеем дело с этой командой: 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, вы можете просто запустить:
В
globstar
опции делает**
матч «все файлы и 0 или более каталогов и подкаталогов». Другими словами, это соответствует всему рекурсивно. Потому что/
в конце**/
будут совпадать все каталоги и подкаталоги (без файлов). Следовательно, команда$d
будет перебирать все каталоги в текущем каталоге и их подкаталогах, иPhotos
каталог будет создан в каждом из них.-p
Флагmkdir
средств:Здесь я просто использую его для подавления сообщений об ошибках, если целевой каталог уже существует. Удалите его, если хотите увидеть ошибки.
Обратите внимание, что при этом не удастся создать
Photo
подкаталог в целевом каталоге, который содержит файл с именем Photo. Вы не указали, что следует делать в этих случаях, и все остальные ответы, опубликованные до сих пор, также имеют это ограничение.источник