Как удалить файлы, отфильтрованные awk

У меня есть следующие файлы в каталоге:

-rw-r--r-- 1 smsc sys 46 Apr 22 12:09 bills.50.1.3G.MO.X.20120422120453.Z -rw-r--r-- 1 smsc sys 28 Apr 22 12:15 bills.50.1.3G.MO.X.20120422120953.Z -rw-r--r-- 1 smsc sys 46 Apr 22 12:20 bills.50.1.3G.MO.X.20120422121453.Z -rw-r--r-- 1 smsc sys 46 Apr 22 12:25 bills.50.1.3G.MO.X.20120422121953.Z 

Где пятый столбец – это размер файла. Я хочу удалить все файлы размером 46. Чтобы отфильтровать эти файлы, я использовал следующую команду:

 ls -ltr | awk '$5 ~ /46/ {print $0}' 

Что хорошо работает. Но теперь я хочу удалить все файлы, которые были отфильтрованы, поэтому я добавлю следующую команду:

 ls -ltr | awk '$5 ~ /46/ {print $0}' | xargs rm 

Однако это дает мне следующую ошибку:

 rm: invalid option -- w 

Кажется, что мне нужно использовать find over ls поэтому я получу результат в следующем формате:

 ./bills.50.1.3G.MO.X.20120421050453.Z ./bills.50.1.3G.MO.X.20120421154953.Z ./bills.50.1.3G.MO.X.20120419133452.Z 

Но тогда у меня нет возможности фильтровать файлы по его параметрам. Как эта задача может быть выполнена?

3 Solutions collect form web for “Как удалить файлы, отфильтрованные awk”

У вас есть две ошибки:

  1. Вы сравниваете размер, который содержит 46 ; вы хотите, чтобы он был равен 46.

  2. Вы печатаете всю строку, если хотите только имя файла.

И еще одна проблема: какая точка -ltr сортирует вывод ls если вы не используете порядок сортировки?

Вы хотите сделать что-то вроде

 ls -l | awk '$5 == "46" {print $9}' | xargs rm 

За исключением того, что вы не хотите этого делать, потому что, хотя в настоящий момент это может быть безопасно, разбор ls вывода является ненадежным. Используйте соответствующий инструмент, такой как

 find . -maxdepth 1 -size 46c -delete # requires GNU find 

(Выполнение этой переносимости более раздражает, так как у POSIX find нет -maxdepth или -maxdepth который работает в единицах, отличных от блоков. Лучше написать скрипт в Perl / Python / Ruby / etc, который может использовать правильное сканирование каталога это не вызовет проблем со специальными символами в именах файлов.)

В zsh, чтобы удалить все файлы размером 26 в текущем каталоге (первая строка) или в текущем каталоге и его подкаталогах (вторая строка), используйте классификатор L glob :

 rm *(L26) rm **/*(L26) 

С GNU или FreeBSD / NetBSD / OSX найдите:

 find . -name . -o -type d -prune -o -type f -size 26c -exec rm {} + find . -type f -size 26c -exec rm {} + 

Портабельно:

 find . -name . -o -type d -prune -o -type f -exec sh -c '[ $(wc -c <"$0") -eq 26 ] && rm -- "$0"' {} \; find . -type f -exec sh -c '[ $(wc -c <"$0") -eq 26 ] && rm -- "$0"' {} \; 

find лучший вариант здесь. вы можете использовать stat чтобы найти размер файла, не используя ls

 for file in *; do (( $(stat -c %s "$file") == 46 )) && rm "$file" done 
  • найти . . * -тип f -print0 | xargs -0 sudo chmod 664; не работает
  • Пауза (с чтением или аналогичным) в xargs
  • Передача нескольких аргументов в середине команды с помощью xargs
  • Как искать слово во всем содержимом каталога в linux
  • Добавить суффикс ко всем файлам без определенного расширения и сохранить расширение файла
  • GNU parallel vs & (я имею в виду фон) vs xargs -P
  • Несколько аргументов с использованием xargs.
  • Список протоколов файлов и каталогов на du показывает только размеры каталогов?
  • Печать состояния файлов, обрабатываемых при использовании find
  • Что делает эта командная строка (`echo $ 1 | xargs -n 1 basename | cut -d '.' -f1`)?
  • Как мне получить xargs, чтобы показать мне строки команд, которые он генерирует, не запуская их?
  • Interesting Posts

    Почему я получаю 3048 МБ из флеш-памяти 64 МБ?

    Regex не соответствует файлу с помощью `find`, несмотря на то, что он действителен

    / usr / bin / kde-print-queue требует прав sudo – как разрешить нормальное использование принтера приостановки?

    Перемещение согласованной строки над другой совпадающей строкой с помощью sed

    awk с переменными в состоянии и в файле перенаправления вывода

    Какова скорость сетевого соединения между двумя контейнерами, которые взаимодействуют через виртуальный мост, работающий на одном и том же хосте?

    Как узнать номер моей работы, когда я выполняю программу COBOL через сценарий оболочки

    Рассчитать время отклика Apache за последние 10 секунд

    Linux. Проверьте параметры make-файла, с помощью которых создается текущее ядро.

    Как pkill из сценария?

    Не удалось разместить сервер с Xpra, подключиться только к существующему

    Как сделать фиктивное приложение считывает файлы gzip («на лету») без изменений кода

    не могу найти -lm

    Разделить строку имен файлов в массив

    Ошибка Netboot: неверный аргумент ядра

    Linux и Unix - лучшая ОС в мире.