LINUX.ORG.RU

Удаление файлов с пробелами в именах через пайп

 , ,


0

2

Привет!

Хочу поудалять файлы. Для этого использую find и file. Первый чтобы отобрать файлы по времени, второй - по типу (т.е. чтобы не смотреть на расширение).
Делаю это примерно так:

find /dir -mtime -3 -exec file '{}' \; | grep something | awk -F':' '{print $1}' | xargs -l rm

Естественно, оно не работает, т.к. есть пробелы в именах. Я знаю про опцию -0 и соответствующую опцию -print0 у find'а.
Но их использовать нет возможности, т.к. между find'ом и xargs'ом есть другие команды. Они жалуются на нулевые символы в stdin.

Шо делать?

P.S. Давно надо текстовый фарш выхлопа стандартных утилит отнести на помойку истории и заменить объектами!
P.P.S. Да, решение, конечно, найдется, но каждый раз искать бубен под частные случаи как-то не круто.

★★★★★

find -print0 ... | grep -z ... | xargs -0 ...

Давно надо текстовый фарш выхлопа стандартных утилит отнести на помойку истории и заменить объектами!

Лето жаркое, тебе припекло.

t184256 ★★★★★ ()
Последнее исправление: t184256 (всего исправлений: 1)
Ответ на: комментарий от t184256

Лето жаркое, тебе припекло.

Не сработало, как показала проверка с echo. Часть результатов куда-то делась. Без этого в выхлопе было гораздо больше строчек (имен файлов).

find /dir -print0 -mtime -3 -exec file '{}' \; | grep -z something | awk -F':' '{print $1}' | xargs -0 -l echo

Список получается раза в 4 меньше. Может быть file или awk тоже не любят 0-символ?

ls-h ★★★★★ ()
Ответ на: комментарий от sin_a

Не?

Не! А ты пробовал с пробелами?
Я для проверки попробовал вот так:

while read i ; do file $i ; done

И получил кучу
file: cannot open `file' (No such file or directory)
name:                                                                                cannot open `name' (No such file or directory)
Т.е. деление по пробелу.

ls-h ★★★★★ ()
Ответ на: комментарий от ls-h

UPD Аwk не работает в такой связке. В выхлоп попадают кусочки текста от file'а.

ls-h ★★★★★ ()
Ответ на: комментарий от sin_a

Кавычки для слабаков?

Да. Двойные помогли. Заработало! Спасибо!

ls-h ★★★★★ ()

Задача решена, но я предлагаю тему перенести в толксы и устроить срач! Т.к. для простого действия требуется неочевидная и неудобочитаемая лапша. А текстовый фарш выхлопа стандартных утилит и их параметры таки отнести на помойку истории и заменить объектами! =)

ls-h ★★★★★ ()
Ответ на: комментарий от ls-h

А лучше вообще как-то так:

FUNK(){
 FILENAME="$*"
 echo "$FILENAME"
 ls -l "$FILENAME"
 file "$FILENAME"
 echo "$FILENAME" | grep somestring && echo "bingo"
}

find /dir -mtime -3 -exec file '{}' \; | while read i ; do FUNK $i ; done
sin_a ★★★★★ ()
Ответ на: комментарий от ls-h

Пистон, говорили они, программирование, говорили они...

sin_a ★★★★★ ()

а что самому в кавычки заключить нельзя ?

find /dir -mtime -3 -exec file '{}' \; | grep "file text2" | awk -F':' '{print "\""$1"\""}' | xargs -l rm
vtVitus ★★★★★ ()
Ответ на: комментарий от HerrWeigel

На будущее: http://www.dwheeler.com/essays/filenames-in-shell.html

Спасибо! Полезный набор костылей. Что особенно забавно, для некоторых присутствует рекомендация к постоянному применению. Что наглядно показывает, в какую опу зашла изначально хорошая концепция unix-way'я. =)

ls-h ★★★★★ ()

Подучить Perl :)

Пример того, что можно проверить, вызвав в -exec от find:

-w # Файл доступен для записи текущему пользователю или группе (effective uid/gid)
-x # Файл доступен для выполнения текущему пользователю или группе (effective uid/gid)
-o # Файл принадлежит текущему пользователю (effective uid)

-R # Файл доступен для чтения реальному пользователю или группе (real uid/gid)
-W # Файл доступен для записи реальному пользователю или группе (real uid/gid)
-X # Файл доступен для выполнения реальному пользователю или группе (real uid/gid)
-O # Файл принадлежит реальному пользователю (real uid)

-e # Файл существует
-z # Файл имеет нулевой длины (пуст)
-s # Файл имеет ненулевую длину ( возвращает размер в байтах )

-f # Обычный файл.
-d # Файл является каталогом.
-l # Файл является символической ссылкой.
-p # Файл либо файловый дескриптор являются именованным каналом (FIFO).
-S # Файл является сокетом.
-b # Блочный файл.
-c # Символьный файл.
-t # Дескриптор файла открыт в текущем терминале (tty).

-u # Для файла установлен бит setuid
-g # Для файла установлен бит setgid
-k # Для файла установлен "липкий бит" (sticky bit)

-T # Файл является текстовым в формате ASCII (эвристическая догадка).
-B # Файл является "Двоичным"(бинарным) (в противоположность -T).

-M # Время, прошедшее от последней модификации файла до запуска сценария, в днях.
-A # Время, прошедшее от последнего обращения к файлу до запуска сценария, в днях.
-C # Время, прошедшее от последнего изменения индексного дескриптора (inode) до запуска сценария

Скрипт ровно в одну строчку и никаких бубнов - проверяй и удаляй.

Majestio ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.