Переименовать файлы в папке в одно имя

Используя 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.

0
12.11.2019, 06:23
2 ответа

Предполагая, что у вас есть один файл.pdb в каждом из ваших каталогов (, в противном случае вопрос не имеет смысла):

for dir in */ ; do
    [ -f "$dir/*.pdb" ] && mv "$dir/*.pdb" "$dir/test.pdb"
done
2
28.01.2020, 02:29

Есть две непосредственные причины того, что ваша попытка не работает:

  1. Вы не используете переменную d, которую используете для перебора каталога.
  2. Ваш глобус итерации не включает конечные файлы, а только подкаталоги -.

РЕДАКТИРОВАТЬ :Вот, во-первых, улучшенный более простой ответ, который не требует выполнения каких-либо проверок, поскольку начальный глобус выбирает только файлы 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
  1. root-directory— это любая спецификация абсолютного пути -, которую вы используете.
  2. root-directory/*/*— это глобус, который будет возвращать фактические файлы в определенном вами случае, а не только подкаталоги -.
  3. =~— это расширение оболочки bash, позволяющее проводить ограниченное тестирование регулярных выражений, в данном случае для строки, оканчивающейся наpdb
  4. &&— логическое И; это обычная идиоматическая замена простого if...then(не забудьте символ продолжения обратной -косой черты в предыдущей строке ).
0
28.01.2020, 02:29

Теги

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