LINUX.ORG.RU

find и неумение гуглить

 ,


0

1

Надо это скормить следующей проге:

find $PATH_S -print0 -depth -name 'тутшота'

Но тогда тут пути с пробелами и жопа, как навесить на каждый кавычки? Нашел кучу каких-то костылей, но ничего нужного, чтобы было просто ровно это. Весь баш такой? :\

Спасибо :)

P.S как же неудобно, бррр

Решение — тоже костыль:

find $PATH_S -depth -name 'костыли' | while read i; do echo -n '"'$i'" '; done



Последнее исправление: Google-ch (всего исправлений: 1)

Сколько пользуюсь find - никаких проблем с пробелами и жопой. Ты что-то делаешь не так.

anonymous
()

Я правильно понял, что тебе вывод от find нужно передать для построчной обработки другой проге? Тогда в скрипте укажи перед find вот такое:

IFS=$'\n'
post-factum ★★★★★
()
Последнее исправление: post-factum (всего исправлений: 1)
Ответ на: комментарий от post-factum

И что будет? Можно объяснить что это значит? :)

Я пока тут сделал так, но оно получилось с переносами строки :(

find $PATH_S -depth -name 'шота' | while read i; do echo '"'$i'"'; done
Google-ch
() автор топика
Ответ на: комментарий от post-factum

И не помогло, кстати

Наверно только остался вопрос: как убрать переносы?

Или это совсем костыль, как я сделал

Google-ch
() автор топика

Кстати, нормально оно работает:

ls
.  ..  file with spaces  file with spaces 2  file with spaces 3

find . -maxdepth 1 -name "*file*" |while read F; do echo "file: $F"; done
file: ./file with spaces 3
file: ./file with spaces 2
file: ./file with spaces

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Google-ch

Это значит, что разделителем будет символ новой строки, а не пробел.

У меня работает:

[pf@spock]:[~/work/tmp/test][0]% ls -lh
total 4,0K
-rw-r--r-- 1 pf pf  0 гру 16 11:21 a b
-rw-r--r-- 1 pf pf 93 гру 16 11:21 test.sh
-rw-r--r-- 1 pf pf  0 гру 16 11:21 word1 word2
[pf@spock]:[~/work/tmp/test][0]% cat test.sh 
#!/usr/bin/env bash
IFS=$'\n'
find . -depth -name '*' | while read i; do echo '"'$i'"'; done
[pf@spock]:[~/work/tmp/test][0]% sh test.sh 
"./a b"
"./test.sh"
"./word1 word2"
"."
post-factum ★★★★★
()
 find -print0 | xargs -0 ...
sdio ★★★★★
()
Ответ на: комментарий от Google-ch

Во-первых, тебе не нужно писать -print0.

Во-вторых, прочти внимательно, что я написал: read считывает данные построчно, поэтому у тебя в F будет именно имя файла — пофиг, с пробелами оно или без.

Соответственно, дальше ты в скрипте этот $F можешь как хочешь использовать.

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от maloi

но скорее всего тебе таки надо читать про -print0 и xargs -0

maloi ★★★★★
()
Ответ на: комментарий от Google-ch

Ну я собственно решение уже-ж написал

Имена с кавычками и/или апострофами тебе еще не встречались?

sdio ★★★★★
()
Ответ на: комментарий от Google-ch

И да, я потом что-то не могу это скормить

$ find -print0 | xargs -0 file
.:      directory
./1:    empty
./2  3: empty
./3
4:  empty

и прочитай ман, не позорься.

drBatty ★★
()

Кстати, а и правда, что скажет твой скрипт на такое:

ls
.  ..  file with spaces  file with spaces 2  file with spaces 3  file with spaces and \'apostrophes\'  file with spaces and "quotations"

Простой find на апострофы матюкается:

find . -maxdepth 1 -name "*file*" |while read F; do ls "$F"; done
ls: невозможно получить доступ к ./file with spaces and 'apostrophes': Нет такого файла или каталога
./file with spaces and "quotations"
./file with spaces 3
./file with spaces 2
./file with spaces

А вот так — ВР:

find . -maxdepth 1 -name "*file*" -print0 | xargs -I{} -0 ls {}
./file with spaces and \'apostrophes\'
./file with spaces and "quotations"
./file with spaces 3
./file with spaces 2
./file with spaces

Eddy_Em ☆☆☆☆☆
()
Последнее исправление: Eddy_Em (всего исправлений: 1)

Надо это скормить следующей проге:

find $PATH_S -print0 -depth -name 'тутшота'

А в чём проблемы?

Кстати, переменные лучше оборачивать в "", чтобы внутри них не интерпретировались спецсимволы.

Но тогда тут пути с пробелами и жопа, как навесить на каждый кавычки?

А как же -print0? Он разделяет пути к файлам нулевым байтом, которого в путях к файлам быть не может вообще. Читайте вывод find аналогичным образом, и будет счастье.

А хотите надёжных костылей - use File::Find; print $_,$/ for map { quotemeta } finddepth( sub{ /костыли/ }, $ENV{PATH_S} );
</сарказм>

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

Брр, как я же я ненавижу *sh за всё это! :)

Я слепил на коленке что-то для себя и доволен как слон..

Всем огромное спасибо! :)

Google-ch
() автор топика
Ответ на: комментарий от sdio

Кстати моё решение из шапки работает для кавычек и прочего ;)

Google-ch
() автор топика
Ответ на: комментарий от AITap

Читайте вывод find аналогичным образом, и будет счастье.
А хотите надёжных костылей - use File::Find;

Не, не,не ... есть же perl -0

sdio ★★★★★
()
Ответ на: комментарий от Google-ch

Брр, как я же я ненавижу *sh за всё это! :)

причём тут *sh? оно тут и не нужно.

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