Как я могу рекурсивно создать каталог в последних каталогах с помощью командной строки?

Если вы технически склонны, вы можете написать один без особых проблем!

Вот источник popsquares. Посмотрите, насколько это крошечно!

Заставка GNOME действительно поддерживает xscreensaver, поэтому вы можете сделать это несколькими различными способами:)

Вот popsquares для записи xscreensaver и некоторые примеры, а также то, как они вызываются заставкой, это само.

Вот несколько примеров из примеров GNOME .

[d10 ] Я лично люблю это приложение! Возможно, кто-то может это написать!

5
задан 26 September 2017 в 23:39

12 ответов

Сначала включите рекурсивное 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]

6
ответ дан 22 May 2018 в 18:05
  • 1
    Вы можете ограничить цикл for для итерации по каталогам: for d in **/; и не забудьте указать свои переменные – glenn jackman 26 September 2017 в 22:58
  • 2
    @glennjackman благодарит! Это действительно ломается, если не ограничивается каталогами. И я подумал, что могу процитировать все это выражение, но, нет! – Zanna 26 September 2017 в 23:09
  • 3
    [F1] вводит подоболочку, поэтому вложенные двойные кавычки вообще не взаимодействуют друг с другом. – glenn jackman 26 September 2017 в 23:37
  • 4
    Можно ли изменить это, чтобы создать папку текстур на один уровень над последней папкой, так что в примере она будет делать currentDir / Dir1 / Textures, currentDir / Dir1 / Di1 / Textures, currentDir / Dir2 /, currentDir / Dir2 / Dir2 , и currentDir / – kingcobra1986 27 September 2017 в 22:41
  • 5
    Я не понимаю ваш пример - я думаю, что один уровень выше последнего должен давать currentDir/Dir1/Dir1/Textures, currentDir/Dir1/Dir2/Textures и currentDir/Dir2/Textures @ kingcobra1986, и я еще не мог понять пути. Python может это сделать, я предполагаю ... – Zanna 27 September 2017 в 23:36

Сначала включите рекурсивное 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]

6
ответ дан 18 July 2018 в 06:11

Сначала включите рекурсивное 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]

6
ответ дан 24 July 2018 в 18:32

Вот мучительный вызов 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
5
ответ дан 22 May 2018 в 18:05
  • 1
    Выдающееся использование команды find, приятно :-) – George Udosen 26 September 2017 в 22:46
  • 2
    @glenn, вы имели в виду VTC это как вне темы? Мне кажется, что мне не хватает? Кроме того, почему бы не mkdir -p вместо тестирования проверить, существует ли он уже? – terdon♦ 27 September 2017 в 12:11
  • 3
    Да, это не специфичный для Ubuntu. Я думаю, что это лучше. Как вы могли бы использовать mkdir -p только для добавления subdir в каталог листьев без тестирования ? – glenn jackman 27 September 2017 в 12:38
  • 4
    Можно ли изменить это, чтобы создать папку текстур на один уровень над последней папкой, так что в примере она будет делать currentDir / Dir1 / Textures, currentDir / Dir1 / Di1 / Textures, currentDir / Dir2 /, currentDir / Dir2 / Dir2 , и currentDir / – kingcobra1986 27 September 2017 в 22:41

Это должно работать:

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
3
ответ дан 22 May 2018 в 18:05

Python делает это легко.

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 '., и вы увидите ? вместо >.

1
ответ дан 22 May 2018 в 18:05

Python делает это легко.

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 '., и вы увидите ? вместо >.

1
ответ дан 18 July 2018 в 06:11

Это должно работать:

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
3
ответ дан 18 July 2018 в 06:11

Вот мучительный вызов 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
5
ответ дан 18 July 2018 в 06:11

Python делает это легко.

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 '., и вы увидите ? вместо >.

1
ответ дан 24 July 2018 в 18:32

Это должно работать:

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
3
ответ дан 24 July 2018 в 18:32

Вот мучительный вызов 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
5
ответ дан 24 July 2018 в 18:32
  • 1
    Выдающееся использование команды find, приятно :-) – George Udosen 26 September 2017 в 22:46
  • 2
    @glenn, вы имели в виду VTC это как вне темы? Мне кажется, что мне не хватает? Кроме того, почему бы не mkdir -p вместо тестирования проверить, существует ли он уже? – terdon♦ 27 September 2017 в 12:11
  • 3
    Да, это не специфичный для Ubuntu. Я думаю, что это лучше. Как вы могли бы использовать mkdir -p только для добавления subdir в каталог листьев без тестирования ? – glenn jackman 27 September 2017 в 12:38
  • 4
    Можно ли изменить это, чтобы создать папку текстур на один уровень над последней папкой, так что в примере она будет делать currentDir / Dir1 / Textures, currentDir / Dir1 / Di1 / Textures, currentDir / Dir2 /, currentDir / Dir2 / Dir2 , и currentDir / – kingcobra1986 27 September 2017 в 22:41

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

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