У меня есть набор файлов в каталоге, пронумерованных следующим образом:
file1.txt
file2.txt
...
file30.txt
...
Теперь я хотел бы запустить команду для определенного диапазона файлов, скажем, с 18 по 31.
До сих пор я использовал следующие способы,
три аргумента
command file1[8-9].txt file2[0-9].txt file3[0-1].txt
Теперь предположим, что я хочу любой номер,
петля
for i in `jot - 18 31 2`; do echo file${i}.txt; done | xargs command
похоже, это более надежный цикл (пробелы работают)
for i in `jot - 18 31 2`; do echo "\"file${i}.txt\" "; done | xargs command
но кажется, что должен быть более простой способ сделать это. Я предполагаю, что лучшее решение - создать функцию bash, которая будет возвращать набор файлов в командную строку. Тогда я мог бы сделать что-то вроде,
command `filerange file 18 31`
Есть ли лучшие способы или предложения по эффективному выполнению этой задачи?
Я заранее прошу прощения, если я пропустил тот же вопрос, на который ответили где-то еще в Интернете или в сети superuser
.
for
цикла, который позволяет использовать пробелы в именах файлов с помощью xargs. Кажется, это работает, если у вас нет bash 4. Если у вас есть bash 4, то обязательно используйте расширение скобки! Смотрите выбранный ответ. Бесстыдная вилка для обновления Snow Leopard bashОтветы:
Попробуй это:
Он известен как «выражение последовательности» и является частью функции расширения скобок Bash . Работает в Баш 3 и 4.
Функция приращения является новой для Bash 4. Возможно, у вас есть Bash 3.x.
В Bash 4 вы можете сделать:
Но в Bash 3 вы должны сделать это, чтобы получить те же результаты:
Та же форма увеличивается на единицу:
Любое число может быть переменной или выражением. Однако в выражении последовательности числа должны быть константами
Вот пример использования этой формы в ваших файлах:
Еще одна новая особенность выражений последовательности в Bash 4 - возможность включать ведущие нули. Это полезно, если вы хотите создать (и использовать) пронумерованные файлы, которые можно правильно отсортировать.
В Bash 4:
создаст файлы с именами «file001.txt» - «file010.txt». Их имена будут отсортированы в ожидаемом порядке. Без начальных нулей файл «file10.txt» будет отсортирован перед «file1.txt».
Для работы с файлами вы можете использовать тот же синтаксис начального нуля:
В Bash 3, если вам нужны начальные нули, вам нужно добавить значение самостоятельно:
Оператор
printf
добавляет к значению i начальные нули, поэтому ширина равна 3, например («4» становится «004»).Редактировать:
Размещение пробелов в именах файлов просто:
источник
{1..10..2}
работу в моем OSX Bash.{01..10}
являются новыми для Bash 4. Возможно, у вас есть Bash 3.x. Если вам нужна функция приращения или для использования переменных для границ диапазона, используйте эту форму:for ((i=1; i<=10; i+=2}
(илиi++
для приращения на единицу). Любое число может быть переменной или выражением. Затем, чтобы использовать значение внутриfor
цикла:echo "file${i}.txt". In Bash 3, if you need leading zeros, inside the for loop do:
printf -vi '% 03d' $ i`, который будет добавлять значениеi
с начальными нулями, например, с шириной 3, например ("4" становится "004").