Используя xargs
, вы можете достичь определенной степени параллелизма:
find. -type d -maxdepth 1 -mindepth 1 -print0 |
xargs -t0 -n 1 -P 5 -I XX tar czf XX.tar.gz XX
Это флаг -P 5
, который ограничивает количество параллельных процессов, запускаемых xargs
, до пяти, в то время как -n 1
используется для выполнения утилиты только с одной входной строкой за раз. С помощью -I XX
мы говорим, что строка ввода, которая будет путем к каталогу, должна быть заменена на строку XX
в команде.
xargs
распечатает вызовы tar
по мере их выполнения. Удалите -t
, чтобы отключить это.
Пути к каталогам передаются из find
с -print0
и принимаются xargs
с -0
(, т. е. с использованием \0
в качестве разделителя ), чтобы можно было использовать экзотические имена.
Как указано в ответе в другом месте на этом сайте:
Note that the bottleneck of the operation would likely be the hard drive. For that reason, even if you did split the task in two or more processes, it would not go faster unless they operate on different drives.
Предполагая, что у вас есть один файл.pdb в каждом из ваших каталогов (, в противном случае вопрос не имеет смысла):
for dir in */ ; do
[ -f "$dir/*.pdb" ] && mv "$dir/*.pdb" "$dir/test.pdb"
done
Есть две непосредственные причины того, что ваша попытка не работает:
d
, которую используете для перебора каталога. РЕДАКТИРОВАТЬ :Вот, во-первых, улучшенный более простой ответ, который не требует выполнения каких-либо проверок, поскольку начальный глобус выбирает только файлы pdb.
for one-path in root-directory/*/*.pdb
do
mv "$one-path" "$(dirname $one-path)/test.pdb"
done
Мой первоначальный второстепенный ответ следует вместе с некоторыми комментариями, используя оболочку bash и две основные утилиты(basename
иdirname
):
for one-path in root-directory/*/*
do
[[ "$(basename "$one-path")" =~ pdb$ ]] \
&& mv "$one-path" "$(dirname $one-path)/test.pdb"
done
root-directory
— это любая спецификация абсолютного пути -, которую вы используете. root-directory/*/*
— это глобус, который будет возвращать фактические файлы в определенном вами случае, а не только подкаталоги -. =~
— это расширение оболочки bash, позволяющее проводить ограниченное тестирование регулярных выражений, в данном случае для строки, оканчивающейся наpdb
&&
— логическое И; это обычная идиоматическая замена простого if
...then
(не забудьте символ продолжения обратной -косой черты в предыдущей строке ).