Подстановочное расширение Bash

Наши поля могут легко продвинуть несколько сотен нормальных HTTP-соединений. Добавьте в PHP, и он отбросит некоторых что. Даже старое поле P2-400, у нас было выполнение до несколько месяцев назад, обрабатывало 50 + параллельные соединения без любых проблем.

Существует довольно много настраивающихся опций в веб-сервере, который может решить проблемы, которые Вы могли видеть. Вещи как неактивный тайм-аут и персистентность соединения и обычно в отказе.

3
задан 12 January 2011 в 00:29
7 ответов
ls /dir |while read dirname; do cp -v /dir/"$dirname"/file "$dirname"-file ; done
2
ответ дан 3 December 2019 в 05:18

Моя первая мысль - Вы, вероятно, делают эту проблему слишком сложной. Однако это разрешимо.

Можно сделать что-то вроде этого с сумасшедшим циклом удара:

for i in /dir/*/file
do
  j=${i%/file}
  k=${j#/dir/}

  cp $i %k-file
done

это использует несколько строковых операторов удара для извлечения количества исходного каталога.

Я гарантирую, что существуют waaay лучшие способы сделать это, это, что пришло на ум.

3
ответ дан 3 December 2019 в 05:18
zsh% autoload zmv       # should be done for you, noting it just in case
zsh% zmv -C '(*)/file' '$1-file'

zmv является функцией оболочки, часто используемой через alias mmv='noglob zmv -W' для еще более легкого вызова, но в этом случае Вы хотите, чтобы регулярное использование, плюс-C скопировало вместо перемещения.

2
ответ дан 3 December 2019 в 05:18

Как Phil сказал, необходимо будет выполнить итерации по элементам расширенного подстановочного знака; извлечение бита Вы заботитесь о (в Вашем примере, названии каталога под dir/) и затем действие на то извлеченное значение.

У меня есть другой быстрый и hacky способ сделать это ниже. Очевидная ошибка - то, что это собирается повредиться, если существуют пробелы в именах файлов, но это не единственная ошибка.

andromeda:tmp polleyj$ find dir/ ?-file
dir/
dir//1
dir//1/a
dir//1/b
dir//1/c
dir//2
dir//2/d
dir//2/e
dir//2/f
dir//3
dir//3/g
dir//3/h
dir//3/i
1-file
2-file
3-file
andromeda:tmp polleyj$ for f in dir/*; do
> i=$(basename $f)
> mv dir/${i}/* ${i}-file/
> done
andromeda:tmp polleyj$ find dir/ ?-file
dir/
dir//1
dir//2
dir//3
1-file
1-file/a
1-file/b
1-file/c
2-file
2-file/d
2-file/e
2-file/f
3-file
3-file/g
3-file/h
3-file/i
andromeda:tmp polleyj$ 
0
ответ дан 3 December 2019 в 05:18

На большинстве дистрибутивов (использующий util-Linux переименовывают):

rename /file -file /dir/*/file

На Debian и Ubuntu (обвиняют Debian):

rename.ul /file -file /dir/*/file

Или использование Perl переименовывает (на Debian и Ubuntu, я не знаю, где найти его в других дистрибутивах):

rename 's,(\d+)/file,$1-file,' */file
0
ответ дан 3 December 2019 в 05:18

Это не симпатично:

find -type f -exec sh -c 'cp "{}" "$(basename "$(dirname "{}")")-$(basename "{}")"' \;
0
ответ дан 3 December 2019 в 05:18

Если я понял Вашу мысль, mcp делает то, что Вы хотите.

Подсказка: mcp принадлежит mmv пакету.

Ваша ситуация:

$ tree
.
├── dir
│  ├── 1
│  │  └── foo
│  ├── 2
│  │  └── bar
│  └── 3
│  └── baz
└── dst

5 directories, 3 files

Решение:

$ mcp -v 'dir/*/*' 'dst/#1-#2'
dir/1/foo -> dst/1-foo : done
dir/2/bar -> dst/2-bar : done
dir/3/baz -> dst/3-baz : done

$ tree
.
├── dir
│  ├── 1
│  │  └── foo
│  ├── 2
│  │  └── bar
│  └── 3
│  └── baz
└── dst
    ├── 1-foo
    ├── 2-bar
    └── 3-baz

5 directories, 6 files

Я думаю, что это должно быть главным образом очевидно

Что происходит, вот то, что mcp берет от и к аргументу. От аргумента может содержать подстановочные шаблоны оболочки (*?) то соответствие ряд файлов. Эти соответствия являются backreferenced в к шаблону заказанным способом как № 1, № 2, № 3 и т.д.

0
ответ дан 3 December 2019 в 05:18

Теги

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