Як 'rm' або 'mv' діапазон файлів, таких як file01.txt, file02.txt ... file85.txt


23

Припустимо, у мене є маса файлів, названих таким чином:

file01.txt file02.txt file03.txt ... file20.txt

і я хочу виконати команду для діапазону цих файлів.

Я знаю, якщо хочу "rm" з "file05.txt" в "file09.txt", я можу зробити:

rm file0[5-9].txt

але як я можу 'rm' діапазон від file08.txt до file13.txt? Я спробував цей код

rm file[08-13].txt

і це не працює. Я міг би виконати цю команду:

rm file0[89].txt file1[0-3].txt

але я хотів би знати, чи можу я це зробити лише одним ще вдосконаленим аргументом до 'rm', якщо це можливо.


Майже ідентичний питання відповів тут: stackoverflow.com/questions/25049411 / ...
arielf

Відповіді:


38

Вам потрібно використовувати розширення дужок bash:

rm file{08..13}.txt

Якщо ви видалите файли file08до file13, з’явиться повідомлення про помилку, якщо якийсь файл відсутній.

Встановіть діапазон відповідно до своїх потреб.


Проблема оператора з глобусом []полягає в тому, що він розглядає кожен символ / цифру всередині нього як єдиний маркер і тому підтримує лише оголошення оголошень діапазону за допомогою однозначних цифр.

Якщо ви наполягаєте на використанні [], ви можете використовувати це досить потворний малюнок в матчі file08з file13:

rm file0[8-9].txt file1[0-3].txt

5
розширення дужки також корисно з запитом, як для mv foo.{txt,md}абоcp foo.txt{,.bak}
Кос

2

Деякі оболонки, наприклад, за замовчуванням Ubuntu /bin/sh(який є dash), або mkshне мають розширення дужок, або у випадку ksh- розширення дужки не може використовувати забиті нулі:

$ ksh -c 'echo {05..13}'
5 6 7 8 9 10 11 12 13

У таких випадках ми можемо скористатися printfформатуванням числової частини імені файлу та циклом часу, щоб реалізувати c-like для поведінки циклу (зверніть увагу на заміну echoна rmабо що завгодно):

$ i=5; while [ "$i" -le 10 ]; do num=$(printf "%.2d" "$i" ); echo "file$num.txt";i=$(($i+1)); done
file05.txt
file06.txt
file07.txt
file08.txt
file09.txt
file10.txt

І це досить портативний - працює з dash, ksh, mksh, і bash. У випадку kshі bashми можемо також використовувати c-style for loop syntax (but not in case ofmksh ordash`):

$ ksh -c 'for((i=5;i<11;i++)); do num=$(printf "%.2d" "$i" ); echo "file$num.txt";done'             
file05.txt
file06.txt
file07.txt
file08.txt
file09.txt
file10.txt

Зауважте, що в такому bashвипадку, printfпідтримує друк на змінну, і, таким чином, ми могли б зробити це printf -v num "%.2d" "$i"замість використання підстановки команд.

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