Если вы технически склонны, вы можете написать один без особых проблем!
Вот источник popsquares. Посмотрите, насколько это крошечно!
Заставка GNOME действительно поддерживает xscreensaver, поэтому вы можете сделать это несколькими различными способами:)
Вот popsquares для записи xscreensaver и некоторые примеры, а также то, как они вызываются заставкой, это само.
Вот несколько примеров из примеров GNOME .
[d10 ] Я лично люблю это приложение! Возможно, кто-то может это написать!
Сначала включите рекурсивное globbing
shopt -s globstar
Теперь мы можем посмотреть во всех каталогах с **. Чтобы отключить, вы можете использовать shopt -u globstar (по умолчанию он выключен, поэтому при открытии новой оболочки он отключается).
Во всех нижеизмените удаление echo после тестирования, чтобы фактически создать каталоги.
Если конечные каталоги пусты, вы можете проверить пустоту и сделать каталог только в том случае, если он обнаружен ... что-то вроде
for d in **/; do [[ -z "$(ls -Aq "$d")" ]] && echo mkdir "$d"Texture; done
т.е. если выход из ls -A (hidden files except current and parent dir) -q (printing ? for non-printing characters) пуст, создайте каталог.
Но поскольку каталоги содержат файлы, лучше проверить, что нет каталогов
for d in **/; do [[ -z "$(find "$d" -maxdepth 1 -mindepth 1 -type d)" ]] && echo mkdir "$d"Texture; done
mindepth -1 заключается в том, чтобы остановить поиск текущего каталога ... find видит скрытые файлы, поэтому мы знаем, что они включены. Поскольку любой символ должен пройти тест (мы хотим только проверить выход пустым), это должно быть достаточно безопасным ...
Более сжатый способ (извините Грега) (но на самом деле все эти методы делают что-то аналогично iffy - мы можем просто уйти с использованием имен файлов в виде текста, так как мы на самом деле ничего не пытаемся сделать с этими файлами):
for d in **/; do (ls -Alq "$d" | grep -q '^d') || echo mkdir "$d"Textures; done
здесь мы добавляем флаг -l для длинный вывод, который печатает каждый файл в форме
drwxrwxr-x 5 zanna zanna 4096 Sep 27 22:00 Dir1
, затем мы обрабатываем этот материал в grep, чтобы увидеть, начинается ли какая-либо из строк с d (что означает, что есть каталог). Мы не хотим, чтобы grep печатал любой из этого бессмысленного ненадежного текста, поэтому мы просто проверяем его статус выхода с помощью -q, чтобы узнать, не нашел ли он что-либо. Если это не так, мы создаем каталог (используя || или оператор, то есть выполните следующую команду, если последняя не сработала). Это должно работать, даже если ваши имена файлов содержат ужасные символы, такие как новые строки, поскольку ls печатает их как ? - каждая строка должна начинаться с буквы, указывающей тип файла, поэтому, вероятно, ни один котята не умрет. [ ! d10]
Сначала включите рекурсивное globbing
shopt -s globstar
Теперь мы можем посмотреть во всех каталогах с **. Чтобы отключить, вы можете использовать shopt -u globstar (по умолчанию он выключен, поэтому при открытии новой оболочки он отключается).
Во всех нижеизмените удаление echo после тестирования, чтобы фактически создать каталоги.
Если конечные каталоги пусты, вы можете проверить пустоту и сделать каталог только в том случае, если он обнаружен ... что-то вроде
for d in **/; do [[ -z "$(ls -Aq "$d")" ]] && echo mkdir "$d"Texture; done
т.е. если выход из ls -A (hidden files except current and parent dir) -q (printing ? for non-printing characters) пуст, создайте каталог.
Но поскольку каталоги содержат файлы, лучше проверить, что нет каталогов
for d in **/; do [[ -z "$(find "$d" -maxdepth 1 -mindepth 1 -type d)" ]] && echo mkdir "$d"Texture; done
mindepth -1 заключается в том, чтобы остановить поиск текущего каталога ... find видит скрытые файлы, поэтому мы знаем, что они включены. Поскольку любой символ должен пройти тест (мы хотим только проверить выход пустым), это должно быть достаточно безопасным ...
Более сжатый способ (извините Грега) (но на самом деле все эти методы делают что-то аналогично iffy - мы можем просто уйти с использованием имен файлов в виде текста, так как мы на самом деле ничего не пытаемся сделать с этими файлами):
for d in **/; do (ls -Alq "$d" | grep -q '^d') || echo mkdir "$d"Textures; done
здесь мы добавляем флаг -l для длинный вывод, который печатает каждый файл в форме
drwxrwxr-x 5 zanna zanna 4096 Sep 27 22:00 Dir1
, затем мы обрабатываем этот материал в grep, чтобы увидеть, начинается ли какая-либо из строк с d (что означает, что есть каталог). Мы не хотим, чтобы grep печатал любой из этого бессмысленного ненадежного текста, поэтому мы просто проверяем его статус выхода с помощью -q, чтобы узнать, не нашел ли он что-либо. Если это не так, мы создаем каталог (используя || или оператор, то есть выполните следующую команду, если последняя не сработала). Это должно работать, даже если ваши имена файлов содержат ужасные символы, такие как новые строки, поскольку ls печатает их как ? - каждая строка должна начинаться с буквы, указывающей тип файла, поэтому, вероятно, ни один котята не умрет. [ ! d10]
Сначала включите рекурсивное globbing
shopt -s globstar
Теперь мы можем посмотреть во всех каталогах с **. Чтобы отключить, вы можете использовать shopt -u globstar (по умолчанию он выключен, поэтому при открытии новой оболочки он отключается).
Во всех нижеизмените удаление echo после тестирования, чтобы фактически создать каталоги.
Если конечные каталоги пусты, вы можете проверить пустоту и сделать каталог только в том случае, если он обнаружен ... что-то вроде
for d in **/; do [[ -z "$(ls -Aq "$d")" ]] && echo mkdir "$d"Texture; done
т.е. если выход из ls -A (hidden files except current and parent dir) -q (printing ? for non-printing characters) пуст, создайте каталог.
Но поскольку каталоги содержат файлы, лучше проверить, что нет каталогов
for d in **/; do [[ -z "$(find "$d" -maxdepth 1 -mindepth 1 -type d)" ]] && echo mkdir "$d"Texture; done
mindepth -1 заключается в том, чтобы остановить поиск текущего каталога ... find видит скрытые файлы, поэтому мы знаем, что они включены. Поскольку любой символ должен пройти тест (мы хотим только проверить выход пустым), это должно быть достаточно безопасным ...
Более сжатый способ (извините Грега) (но на самом деле все эти методы делают что-то аналогично iffy - мы можем просто уйти с использованием имен файлов в виде текста, так как мы на самом деле ничего не пытаемся сделать с этими файлами):
for d in **/; do (ls -Alq "$d" | grep -q '^d') || echo mkdir "$d"Textures; done
здесь мы добавляем флаг -l для длинный вывод, который печатает каждый файл в форме
drwxrwxr-x 5 zanna zanna 4096 Sep 27 22:00 Dir1
, затем мы обрабатываем этот материал в grep, чтобы увидеть, начинается ли какая-либо из строк с d (что означает, что есть каталог). Мы не хотим, чтобы grep печатал любой из этого бессмысленного ненадежного текста, поэтому мы просто проверяем его статус выхода с помощью -q, чтобы узнать, не нашел ли он что-либо. Если это не так, мы создаем каталог (используя || или оператор, то есть выполните следующую команду, если последняя не сработала). Это должно работать, даже если ваши имена файлов содержат ужасные символы, такие как новые строки, поскольку ls печатает их как ? - каждая строка должна начинаться с буквы, указывающей тип файла, поэтому, вероятно, ни один котята не умрет. [ ! d10]
Вот мучительный вызов find -exec
До:
$ tree currentDir
currentDir
├── Dir1
│ ├── Dir1
│ │ └── Dir1
│ ├── Dir2
│ └── Dir3
├── Dir2
│ ├── Dir1
│ └── Dir2
│ └── Dir1
└── Dir3
Создайте каталоги текстур
$ find currentDir -depth -type d -exec bash -c 'cd "$1"; shopt -s globstar nullglob; texture=(**/Texture); [[ ${#texture[@]} -eq 0 ]] && mkdir Texture' _ '{}' \;
Это зависит от: [!d3 ] опция find -depth для включения опции оболочки globstar для навигации по глубине в первой строке для включения рекурсивного сопоставления шаблонов файлов, обратите внимание на аргумент _: он переходит в bash var $0, так что текущее имя пути поиска может быть bash var $1
После
$ tree currentDir
currentDir
├── Dir1
│ ├── Dir1
│ │ └── Dir1
│ │ └── Texture
│ ├── Dir2
│ │ └── Texture
│ └── Dir3
│ └── Texture
├── Dir2
│ ├── Dir1
│ │ └── Texture
│ └── Dir2
│ └── Dir1
│ └── Texture
└── Dir3
└── Texture
Это должно работать:
shopt -s globstar; for i in **/; do sub=$(find "$i" -type d | wc -l); if [[ "$sub" -eq 1 ]]; then mkdir "$i"/Texture; fi;done
Результат:
currentDir
├── Dir1
│ ├── Dir1
│ │ └── Dir1
│ │ └── Texture
│ ├── Dir2
│ │ └── Texture
│ └── Dir3
│ └── Texture
├── Dir2
│ ├── Dir1
│ │ └── Texture
│ └── Dir2
│ └── Dir1
│ └── Texture
└── Dir3
└── Texture
python3 -c 'import os
for d in [root for root, dirs, files in os.walk(".") if not any(dirs)]:
os.mkdir(d + "/Texture")'
Вы можете запустить эту команду из своей оболочки. Он передает трехстрочный скрипт интерпретатору Python 3, который его запускает. Сценарий строит список всех каталогов в . (тот, в котором вы находитесь), а затем создает подкаталог Texture в каждом, у которого еще нет подкаталогов.
Это проще потому что у Python есть функция интерпретатора Python 3 , которая перечисляет каталоги таким образом, чтобы было легко увидеть, какие из них имеют подкаталоги (и, более общо, потому что Python
Если вы хотите просто показать, какие новые каталоги будут созданы, а не создавать их, замените os.mkdir на print. Вот что, если вы хотите скопировать и вставить:
python3 -c 'import os
for d in [root for root, dirs, files in os.walk(".") if not any(dirs)]:
print(d + "/Texture")'
Есть способы написать одну из этих трехстрочных команд в одной строке, но нет необходимости. Вы можете ввести команду, которую хотите использовать в приглашении интерактивной оболочки, путем ввода или вставки ее или ее использования в сценарии оболочки. При вводе в интерактивном режиме ваша оболочка будет печатать > (если вы не установили $PS2 на что-то другое) в начале второй и третьей строк. Это не проблема.
Вышеупомянутое предполагает, что вы используете оболочку типа Bourne, например bash, dash / sh, ksh, zsh, posh и т. Д. (Эти три ответа используют shopt -s globstar. Эта команда имеет значение Bash, хотя некоторые другие оболочки имеют аналогичную функцию. Поэтому, если они работают на вас, это тоже должно быть.) Если вы используете Ubuntu, и вы не знаете в какую оболочку вы вводите команды, это bash. Если вы используете csh или tcsh, вам нужно будет поместить \ в конце первых двух строк, чтобы избежать ошибки Unmatched '., и вы увидите ? вместо >.
Вышеупомянутое предполагает, что вы используете оболочку типа Bourne, например bash, dash / sh, ksh, zsh, posh и т. д. (Эти три ответа используют shopt -s globstar. Эта команда имеет значение Bash, хотя некоторые другие оболочки имеют аналогичную функцию. Поэтому, если они работают на вас, это тоже должно быть.) Если вы используете Ubuntu, и вы не знаете в какую оболочку вы вводите команды, это bash. Если вы используете csh или tcsh, вам нужно будет поместить \ в конце первых двух строк, чтобы избежать ошибки Unmatched '., и вы увидите ? вместо >.
python3 -c 'import os
for d in [root for root, dirs, files in os.walk(".") if not any(dirs)]:
os.mkdir(d + "/Texture")'
Вы можете запустить эту команду из своей оболочки. Он передает трехстрочный скрипт интерпретатору Python 3, который его запускает. Сценарий строит список всех каталогов в . (тот, в котором вы находитесь), а затем создает подкаталог Texture в каждом, у которого еще нет подкаталогов.
Это проще потому что у Python есть функция интерпретатора Python 3 , которая перечисляет каталоги таким образом, чтобы было легко увидеть, какие из них имеют подкаталоги (и, более общо, потому что Python
Если вы хотите просто показать, какие новые каталоги будут созданы, а не создавать их, замените os.mkdir на print. Вот что, если вы хотите скопировать и вставить:
python3 -c 'import os
for d in [root for root, dirs, files in os.walk(".") if not any(dirs)]:
print(d + "/Texture")'
Есть способы написать одну из этих трехстрочных команд в одной строке, но нет необходимости. Вы можете ввести команду, которую хотите использовать в приглашении интерактивной оболочки, путем ввода или вставки ее или ее использования в сценарии оболочки. При вводе в интерактивном режиме ваша оболочка будет печатать > (если вы не установили $PS2 на что-то другое) в начале второй и третьей строк. Это не проблема.
Вышеупомянутое предполагает, что вы используете оболочку типа Bourne, например bash, dash / sh, ksh, zsh, posh и т. Д. (Эти три ответа используют shopt -s globstar. Эта команда имеет значение Bash, хотя некоторые другие оболочки имеют аналогичную функцию. Поэтому, если они работают на вас, это тоже должно быть.) Если вы используете Ubuntu, и вы не знаете в какую оболочку вы вводите команды, это bash. Если вы используете csh или tcsh, вам нужно будет поместить \ в конце первых двух строк, чтобы избежать ошибки Unmatched '., и вы увидите ? вместо >.
Вышеупомянутое предполагает, что вы используете оболочку типа Bourne, например bash, dash / sh, ksh, zsh, posh и т. д. (Эти три ответа используют shopt -s globstar. Эта команда имеет значение Bash, хотя некоторые другие оболочки имеют аналогичную функцию. Поэтому, если они работают на вас, это тоже должно быть.) Если вы используете Ubuntu, и вы не знаете в какую оболочку вы вводите команды, это bash. Если вы используете csh или tcsh, вам нужно будет поместить \ в конце первых двух строк, чтобы избежать ошибки Unmatched '., и вы увидите ? вместо >.
Это должно работать:
shopt -s globstar; for i in **/; do sub=$(find "$i" -type d | wc -l); if [[ "$sub" -eq 1 ]]; then mkdir "$i"/Texture; fi;done
Результат:
currentDir
├── Dir1
│ ├── Dir1
│ │ └── Dir1
│ │ └── Texture
│ ├── Dir2
│ │ └── Texture
│ └── Dir3
│ └── Texture
├── Dir2
│ ├── Dir1
│ │ └── Texture
│ └── Dir2
│ └── Dir1
│ └── Texture
└── Dir3
└── Texture
Вот мучительный вызов find -exec
До:
$ tree currentDir
currentDir
├── Dir1
│ ├── Dir1
│ │ └── Dir1
│ ├── Dir2
│ └── Dir3
├── Dir2
│ ├── Dir1
│ └── Dir2
│ └── Dir1
└── Dir3
Создайте каталоги текстур
$ find currentDir -depth -type d -exec bash -c 'cd "$1"; shopt -s globstar nullglob; texture=(**/Texture); [[ ${#texture[@]} -eq 0 ]] && mkdir Texture' _ '{}' \;
Это зависит от:
опция find -depth для включения опции оболочки globstar для навигации по глубине в первой строке для включения рекурсивного сопоставления шаблонов файлов, обратите внимание на аргумент _: он переходит в bash var $0, так что текущее имя пути поиска может быть bash var $1После
$ tree currentDir
currentDir
├── Dir1
│ ├── Dir1
│ │ └── Dir1
│ │ └── Texture
│ ├── Dir2
│ │ └── Texture
│ └── Dir3
│ └── Texture
├── Dir2
│ ├── Dir1
│ │ └── Texture
│ └── Dir2
│ └── Dir1
│ └── Texture
└── Dir3
└── Texture
python3 -c 'import os
for d in [root for root, dirs, files in os.walk(".") if not any(dirs)]:
os.mkdir(d + "/Texture")'
Вы можете запустить эту команду из своей оболочки. Он передает трехстрочный скрипт интерпретатору Python 3, который его запускает. Сценарий строит список всех каталогов в . (тот, в котором вы находитесь), а затем создает подкаталог Texture в каждом, у которого еще нет подкаталогов.
Это проще потому что у Python есть функция интерпретатора Python 3 , которая перечисляет каталоги таким образом, чтобы было легко увидеть, какие из них имеют подкаталоги (и, более общо, потому что Python
Если вы хотите просто показать, какие новые каталоги будут созданы, а не создавать их, замените os.mkdir на print. Вот что, если вы хотите скопировать и вставить:
python3 -c 'import os
for d in [root for root, dirs, files in os.walk(".") if not any(dirs)]:
print(d + "/Texture")'
Есть способы написать одну из этих трехстрочных команд в одной строке, но нет необходимости. Вы можете ввести команду, которую хотите использовать в приглашении интерактивной оболочки, путем ввода или вставки ее или ее использования в сценарии оболочки. При вводе в интерактивном режиме ваша оболочка будет печатать > (если вы не установили $PS2 на что-то другое) в начале второй и третьей строк. Это не проблема.
Вышеупомянутое предполагает, что вы используете оболочку типа Bourne, например bash, dash / sh, ksh, zsh, posh и т. Д. (Эти три ответа используют shopt -s globstar. Эта команда имеет значение Bash, хотя некоторые другие оболочки имеют аналогичную функцию. Поэтому, если они работают на вас, это тоже должно быть.) Если вы используете Ubuntu, и вы не знаете в какую оболочку вы вводите команды, это bash. Если вы используете csh или tcsh, вам нужно будет поместить \ в конце первых двух строк, чтобы избежать ошибки Unmatched '., и вы увидите ? вместо >.
Вышеупомянутое предполагает, что вы используете оболочку типа Bourne, например bash, dash / sh, ksh, zsh, posh и т. д. (Эти три ответа используют shopt -s globstar. Эта команда имеет значение Bash, хотя некоторые другие оболочки имеют аналогичную функцию. Поэтому, если они работают на вас, это тоже должно быть.) Если вы используете Ubuntu, и вы не знаете в какую оболочку вы вводите команды, это bash. Если вы используете csh или tcsh, вам нужно будет поместить \ в конце первых двух строк, чтобы избежать ошибки Unmatched '., и вы увидите ? вместо >.
Это должно работать:
shopt -s globstar; for i in **/; do sub=$(find "$i" -type d | wc -l); if [[ "$sub" -eq 1 ]]; then mkdir "$i"/Texture; fi;done
Результат:
currentDir
├── Dir1
│ ├── Dir1
│ │ └── Dir1
│ │ └── Texture
│ ├── Dir2
│ │ └── Texture
│ └── Dir3
│ └── Texture
├── Dir2
│ ├── Dir1
│ │ └── Texture
│ └── Dir2
│ └── Dir1
│ └── Texture
└── Dir3
└── Texture
Вот мучительный вызов find -exec
До:
$ tree currentDir
currentDir
├── Dir1
│ ├── Dir1
│ │ └── Dir1
│ ├── Dir2
│ └── Dir3
├── Dir2
│ ├── Dir1
│ └── Dir2
│ └── Dir1
└── Dir3
Создайте каталоги текстур
$ find currentDir -depth -type d -exec bash -c 'cd "$1"; shopt -s globstar nullglob; texture=(**/Texture); [[ ${#texture[@]} -eq 0 ]] && mkdir Texture' _ '{}' \;
Это зависит от:
опция find -depth для включения опции оболочки globstar для навигации по глубине в первой строке для включения рекурсивного сопоставления шаблонов файлов, обратите внимание на аргумент _: он переходит в bash var $0, так что текущее имя пути поиска может быть bash var $1После
$ tree currentDir
currentDir
├── Dir1
│ ├── Dir1
│ │ └── Dir1
│ │ └── Texture
│ ├── Dir2
│ │ └── Texture
│ └── Dir3
│ └── Texture
├── Dir2
│ ├── Dir1
│ │ └── Texture
│ └── Dir2
│ └── Dir1
│ └── Texture
└── Dir3
└── Texture