metaclass: (Default)
metaclass ([personal profile] metaclass) wrote2010-06-04 08:05 pm

Линуксовое

Уткнулся в шизу, которая мне в линуксе по жизни была малопонятна всегда.

Есть, предположим, 1000 файлов в папке. Из них 100 нужно перенести в другую папку, за исключением нескольких, причем критерий выбора этих 100 и пропускаемых из них нескольких в лучшем случае формулируется "содержит заданную подстроку в имени", а в худшем "выбираются вручную".
Вот как бы это сделать из командной строки, потому что очевидное решение "запустить mc, выделить руками и перенести" выглядит виндоюзерским читерством :)

Файлы с пробелами и прочими жыдосимволами в именах, поэтому приходится делать -print0
find . -maxdepth 1 -name "*.mkv" -print0 | xargs -0 mv {} итд итп

Походу, пока писал поцст в ЖЖ, уже нашел как сделать: нужно скомбинировать условия в find операторами:
find . -maxdepth 1 -name "*.mkv" ! -iname "*clowns*" ! -iname "*mimes*" -print0 | xargs -0 mv {} NotAboutClowns/


PS: от жеж хитрожопие - оно ему еще и параметры передает сразу все, нужно целевую папку указывать до остальных параметров: mv -t NotAboutClowns/

[identity profile] elf-from-lorien.livejournal.com 2010-06-04 09:02 pm (UTC)(link)
Один хостер предоставляет доступ по ssh. Так там можно выполнить две команды: cd и mc. Я молодой, не знаю -- это у всех так? :)

[identity profile] metaclass.livejournal.com 2010-06-04 09:10 pm (UTC)(link)
Не знаю, не сталкивался с хостерами :)
Я стараюсь пользоваться командной строкой, это в некотором роде удобнее mc.

[identity profile] lionet.livejournal.com 2010-06-04 09:18 pm (UTC)(link)
а `echo` можно?

[identity profile] zamotivator.livejournal.com 2010-06-04 09:42 pm (UTC)(link)
mv `ls -1 | grep include | grep -v exclude ...` target

[identity profile] metaclass.livejournal.com 2010-06-04 10:38 pm (UTC)(link)
А, тоже метод, да.

[identity profile] zamotivator.livejournal.com 2010-06-04 10:41 pm (UTC)(link)
Я такой юзаю. Удобней типа.

[identity profile] elf-from-lorien.livejournal.com 2010-06-04 11:03 pm (UTC)(link)
Проверил. Можно :)

[identity profile] lionet.livejournal.com 2010-06-04 11:26 pm (UTC)(link)
Ну а что тогда, `echo *` и вперёд!

[identity profile] usovalx.livejournal.com 2010-06-04 11:57 pm (UTC)(link)
Имена с пробелами не работают при этом.

В маковской версии xargs можно сделать так:

ls -1 | grep .... | xargs -I % mv %

[identity profile] theiced.livejournal.com 2010-06-05 03:33 am (UTC)(link)
я вообще извращенец - ls | grep | sed | sh

[identity profile] mega-mosk.livejournal.com 2010-06-05 05:52 am (UTC)(link)
Есть такая команда, grep называется.

[identity profile] metaclass.livejournal.com 2010-06-05 07:26 am (UTC)(link)
У меня тут с grep оказалась проблема - файлы с пробелами и прочей нечистью в именах, приходится использовать -print0, а результат этого grep не понимает.

[identity profile] zamotivator.livejournal.com 2010-06-05 10:47 am (UTC)(link)
grep "name with spaces" ?

[identity profile] ilya-portnov.livejournal.com 2010-06-05 04:38 pm (UTC)(link)
Вот ещё такое иногда бывает удобно: http://dumpz.org/20024/. Называется у меня /usr/local/bin/pick. Использовать можно многими способами, например

cp $(pick *.txt) /kuda/to

или там

find /.../... | pick | xargs ...

Берёт список либо с ком. строки, либо со стандартного ввода, показывает диалог, там галочками отмечаем чо надо, на выводе даёт только отмеченные строки.

[identity profile] usovalx.livejournal.com 2010-06-06 12:27 am (UTC)(link)
Не в том смысле.

~/ > touch messy\ name
~/ > ls -l `ls messy*`
ls: messy: No such file or directory
ls: name: No such file or directory
[1] 5756 exit 1 ls -G -l `ls messy*`

[identity profile] elf-from-lorien.livejournal.com 2010-06-06 01:44 am (UTC)(link)
Хм. И что это дает, кроме замены ls?

[identity profile] nefigtut.livejournal.com 2010-06-06 10:38 am (UTC)(link)
уж позвольте вмешаться, ибо этот вариант почему-то никто не упомянул. опция "-exec". типа так:

find . -bla -bla -bla -exec mv '{}' NotAboutClowns/ \;


кавычки вокруг {} хэндлят пробелы и червей, \; - конец команды. этот вариант кошерен тем, что в случае если подходящих файлов - пара миллионов - то ваш mv грохнется из-за переполнения буфера командной строки или числа параметров, а мой - нет.

да, я встречал необходимость мувнуть два миллиона файлов, это реальная ситуация.
да, на каждый файл будет рожаться свой mv, так что возможно будет чуть-чуть медленнее.

[identity profile] metaclass.livejournal.com 2010-06-06 10:44 am (UTC)(link)
А, xargs жеж формирует список аргументов в виде строки, да.

[identity profile] inhate.livejournal.com 2010-06-06 01:34 pm (UTC)(link)
Я не совсем догнал, зачем костыли с xargs когда есть -exec у find?

[identity profile] metaclass.livejournal.com 2010-06-06 03:10 pm (UTC)(link)
Не додумался его использовать :)

[identity profile] lionet.livejournal.com 2010-06-07 01:32 am (UTC)(link)
Расширение списка cd и mc в два раза.

[identity profile] migmit.vox.com (from livejournal.com) 2010-06-07 05:04 pm (UTC)(link)
В общем, да, наиболее прямой вариант.