2013-06-25 3 views
5

Предположим, что у меня есть некоторый каталог, который содержит ряд подкаталогов, и в каждом из этих подкаталогов я хочу, чтобы создать каталог с таким же именем:Создать подкаталог для всех каталогов в папке

./dir-1 
./dir-2 
... 
./dir-n 

Я хочу mkdir */new-dir

, но это вызывает ошибку. Каков наилучший способ сделать это?

ответ

6
for dir in $(ls); do 
    mkdir "$dir/new-dir" 
done 
3
find . -type d | xargs -I "{x}" mkdir "{x}"/new-dir 

Если вы хотите, чтобы уменьшить его на первый уровень каталогов используете

find . -maxdepth 1 -type d | xargs -I "{x}" mkdir "{x}"/new-dir 
0

Лучше перечислить только каталоги, в противном случае вы можете получить кучу ошибок, когда он встречает файл вместо из каталога

for dir in $(ls -d */); do mkdir "$dir/2015" done

+0

Пожалуйста, не разобрать вывод команды ls. Спасибо. –

3

Удивительно, что этот вопрос никогда о btained разумный ответ:

shopt -s nullglob 
for i in */; do 
    mkdir -- "${i}newdir" 
done 
  • Это 100% безопасно относительно смешных символов в именах файлов (пробелы, специальные символы и т.д.).
  • shopt -s nullglob так, чтобы glob не увеличивался до нуля, если совпадений нет.
  • -- в mkdir, чтобы отметить конец опций (если есть каталог с именем, начинающимся с дефиса, не путайте mkdir, пытаясь интерпретировать его как опцию).

Это молча игнорирует скрытые каталоги. Если вам необходимо выполнить эту операцию на скрытых каталогах, просто замените строку shopt -s nullglob следующим:

shopt -s nullglob dotglob 

The dotglob так, что шарики также рассмотреть скрытые файлы/каталоги.

Если вы хотите только один вызов mkdir:

shopt -s nullglob 
dirs=(*/) 
mkdir -- "${dirs[@]/%/newdir}" 
+0

Удивительно, что я тоже сбил! Ярость вниз, пожалуйста, оставьте записку, спасибо. –