список файлів, пронумерованих у певному діапазоні


16

У мене набір файлів у каталозі пронумеровано так:

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
milkypostman

Відповіді:


25

Спробуйте це:

for file in file{18..31}.txt

Він відомий як "вираз послідовності" і є частиною функції розширення дужок Баша . Він працює в Bash 3 і 4.

Функція приросту нова для Bash 4. У вас, ймовірно, є Bash 3.x.

У Bash 4 ви можете:

$ for i in {1..6..2}; do echo $i; done
1
3
5

Але в Bash 3 вам потрібно зробити це, щоб отримати ті ж результати:

$ for ((i=1; i<=6; i+=2)); do echo $i; done

Приріст однакової форми на одну:

$ for ((i=1; i<=6; i++)); do echo $i; done

Будь-яке з чисел може бути змінним чи виразом. Однак у виразі послідовності числа повинні бути константами

Ось приклад використання цієї форми у ваших файлах:

for ((i=18; i<=31; i++))
do
    echo "file${i}.txt"
done

Ще одна нова особливість виразів послідовностей у Bash 4 - це можливість включати провідні нулі. Це корисно, якщо ви хочете створити (і використовувати) пронумеровані файли, які можна правильно сортувати.

У Bash 4:

touch file{001..010}.txt

створив би файли з назвою "file001.txt" через "file010.txt". Їх імена сортуватимуть у очікуваному порядку. Без провідних нулів "file10.txt" буде сортувати перед "file1.txt".

Для роботи з файлами ви можете використовувати той самий провідний нульовий синтаксис:

for file in file{001..010}.txt; do echo "$file"; done

У Bash 3, якщо вам потрібні провідні нулі, вам потрібно прокладати значення самостійно:

for i in {1..10}
do
    printf -v i '%03d' $i 
    echo "file${i}.txt"
done

Оператор printfдодає значення i з провідними нулями, так що ширина становить 3, наприклад ("4" стає "004").

Редагувати:

Розміщення пробілів у назви файлів просто:

$ touch "space name "{008..018..3}" more spaces"
$ ls -l sp*
-rw-r--r-- 1 user group 0 2011-01-22 11:48 space name 000008 more spaces
-rw-r--r-- 1 user group 0 2011-01-22 11:48 space name 000011 more spaces
-rw-r--r-- 1 user group 0 2011-01-22 11:48 space name 000014 more spaces
-rw-r--r-- 1 user group 0 2011-01-22 11:48 space name 000017 more spaces
$ for f in "space name "{008..018..3}" more spaces"; do mv "$f" "${f}.txt"; done
$ ls -l sp*
-rw-r--r-- 1 user group 0 2011-01-22 11:48 space name 000008 more spaces.txt
-rw-r--r-- 1 user group 0 2011-01-22 11:48 space name 000011 more spaces.txt
-rw-r--r-- 1 user group 0 2011-01-22 11:48 space name 000014 more spaces.txt
-rw-r--r-- 1 user group 0 2011-01-22 11:48 space name 000017 more spaces.txt

Дякую! Я не знаю, де це було все моє життя. Єдине, що я не можу приступити до роботи - це те, що приріст, здається, не працює у версії OSX bash. тобто я не можу взятися {1..10..2}за роботу в моєму OSX-базі.
доярка

Ну, тому що Snow Leopard (чомусь) використовує bash 3.1. Це проблема програмного забезпечення.
доярка

@milkypostman: Функція приросту та провідні нулі {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").
Призупинено до подальшого повідомлення.

Деннісе, чи є можливість оновлювати рішення, включаючи альтернативну форму. Будучи коментарем, це свого роду заплутує те, що я, мабуть, повинен отримати.
доярка

@milkypostman: Дивіться мою відредаговану відповідь.
Призупинено до подальшого повідомлення.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.