Видалення конкретних файлів на основі імені файлу з терміналу


13

У мене є каталог, що містить файли з іменами

rho_0.txt
rho_5000.txt
rho_10000.txt
rho_150000.txt
rho_200000.txt

і так далі. Я хотів би видалити всі ті, які кратні 5000.

Я спробував таке:, printf 'rho_%d.txt\n' $(seq 5000 10000 25000) | rmале це дало мені відповідь rm: missing operand.

Чи є інший спосіб зробити це?


6
Незалежно від того, як це зробити, я рекомендую (для безпеки) перемістити потрібні файли в каталог, тоді, коли ви підтвердите, що всі та лише файли, які потрібно видалити, є в каталозі, видаліть його.
користувач117529

Тут важлива безпека. Я, як правило, lsспочатку перевіряю ці речі .
Скотт

Відповіді:


49

Вам не потрібен цикл або додаткові команди там, де у вас є Bash Shell Brace Expansion.

rm -f rho_{0..200000..5000}.txt

Пояснення : {start..end..step}. -fІгнорувати запрошення на неіснуючі файли.


Ps Щоб зберегти безпеку та перевірити, які файли буде видалено, спочатку зробіть тест:

ls -1 rho_{0..200000..5000}.txt

13

rmне читається зі стандартного вводу. Ви можете зробити:

for i in $(seq 5000 5000 25000); do
    rm -i rho_${i}.txt
done

Я включаю -iможливість rmпідказувати перед видаленням, щоб ви могли перевірити поведінку. Як тільки ви впевнені, що це робить те, що ви хочете, ви можете пропустити цей варіант.

Редагувати. Можна також зробити:

for ((i = 5000; i <= 25000; i += 5000)); do
    rm -i rho_${i}.txt
done

Ця форма може бути більш знайомою, якщо ви виконали будь-яке програмування.


12

Ви не можете передавати програму так, ніби вміст труби було аргументами. Він надсилається через stdin.

Для цього слід використовувати xarg:

printf 'rho_%d.txt\n' $(seq 5000 10000 25000) | xargs rm 

але спершу ви можете спробувати з луною, щоб побачити, чи все так, як ви задумали:

printf 'rho_%d.txt\n' $(seq 5000 10000 25000) | xargs echo

Якщо у вашій версії seqє -f/ --formatпараметр, ви можете використовувати це замість цього обходу printfта заміни команд.
Девід Фоерстер

Дякую, я щойно відповів, використовуючи команду, використану у запитанні, і намагаюся пояснити його rm помилку
M4rty

9

Хтось виправить мене, якщо я помиляюся, але якщо всі файли, які починаються з rho_цієї форми, це не рівнозначно

rm rho_0.txt rho_*[05]000.txt

Оскільки число (крім 0) є кратним 5000, якщо і тільки якщо воно закінчується в 0000 або 5000.

(0 - це окремий випадок, оскільки він кратний 5000, але, як правило, записується без додаткових провідних нулів. Якщо ви не мали наміру включати 0, вийміть його з вищевказаного рядка.)

Звичайно, це слід використовувати лише в тому випадку, якщо всі rho_*.txtфайли у вашому каталозі мають потрібну форму. Не використовуйте його, якщо ваш каталог також містить rho_please_dont_delete_me_5000.txt.

(Примітка математики: Це працює саме тому, що всі основні фактори 5000, а саме 2 і 5, також є основними факторами бази, в якій ми працюємо, 10. Еквівалентно, є достатньо велика потужність 10 (а саме 10000), що ділиться на 5000. Не існує аналогічного трюку для зіставлення всіх, кратних 3000.)


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