LINUX.ORG.RU

Find без рекурсии

 


0

1

Вопрос, ищу файлы в папке, столкнулся с проблемой что цикл в котором ищем файлы начинает обрабатывать не то, точнее начинает лезть в подпапки. man покурил но в итоге не понял как это этого избавиться: f=`find -name \*.mp3` for file in $f do -------------- done


Ответ на: комментарий от futurama

это ключ find ? ок спасибо сейчас попробую

irq15
() автор топика

for file in $f do

Не делай так никогда, если не хочешь проблем. find ... -exec и find | xargs - твои друзья. sh - плохой язык программирования, зато хороший язык вызывания программ.

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

sh хороший язык для скриптов, указанные проблемы легко решаются set -f и IFS=

Правда в find этот цикл вставлять действительно смешно.

vodz ★★★★★
()

Если действительно ищешь только mp3-шки, то за глаза хватит маски.

Получится что-то типа:

ls -1 ./*.mp3 | while read file ; do
   ...
done

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

ls -1 ./*.mp3

ls: Argument list too long

Зачем ты обманул меня, это не работает.

futurama ★★★★★
()

В данном примере тебе и find-то не нужен.

for file in *.mp3
do
    echo "$file"  # -----------------
done

Если же используешь find, то тебе не нужен for, а нужен ключ -exec у оного.

А конкретно на вопрос ответ: man find | grep maxdepth

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

мне потом найденный файл надо дальше обрабатывать, как мне его получить этой командой?

irq15
() автор топика
Ответ на: комментарий от Psych218

В данном примере тебе и find-то не нужен.

спасибо попробую при следующем глюки и остановке скрипта ))

кстати может кто может подсказать, скрипт работает в 1 поток (что логично) ffmpeg внутри скрипта тоже в один. приходиться запускать штук 8 копий чтобы занять вся ядра процессора и получить адекватную скорость. никак не победить данное ограничение?

сейчас у меня просто в начале цикла создается лок файл чтобы другие копии к нему не лезли и в конце цикла удаляется. что не очень хорошо сказывается на производительности

irq15
() автор топика
Ответ на: комментарий от irq15

кстати может кто может подсказать, скрипт работает в 1 поток (что логично) ffmpeg внутри скрипта тоже в один. приходиться запускать штук 8 копий чтобы занять вся ядра процессора и получить адекватную скорость. никак не победить данное ограничение?

ls *.mp3 | parallel "ffmpeg -i {} -c copy {}.new.mp3"

GNU Parallel если вдруг не стоит, поставь из реп (есть везде). Ну и man parellel. Полезная штука вообще ;)

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

ls *.mp3 | parallel «ffmpeg -i {} -c copy {}.new.mp3»

А тут лучше всего make подойдёт. C ключиком -j. Без всяких там левых прибуд.

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

make будет из пушки по воробьям, а parallel — не левая приблуда, а очень удобный инструмент. Очень часто пользуюсь. На каждую фигню мейкфайл писать — какой-то бред.

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

parallel — не левая приблуда

Если надо ставить — левая.

На каждую фигню мейкфайл писать

О да, одну строчку написать собственно с действием, что требуется — это ж как перетрудиться.

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

приходиться запускать штук 8 копий чтобы

Вот поэтому find | xargs -n 1 blabla лучше, он и так хорошо работает, а когда надо у xargs есть ключик --max-procs=.

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