о работе в bash

На самом деле это единственный раздел про unix на этом форуме

Модераторы: /dev/random, Модераторы разделов

beer21
Сообщения: 5
ОС: winxpsp3

о работе в bash

Сообщение beer21 »

Здравствуйте.

Работаю с удаленным сервером чрез ssh, все более менее получается (примитивные вещи типа перемещения, удаления, редактирования файлов и папок), но есть пара вопроссов.

Например есть папка, в ней файлы.

Какую комманду надо ввести чтобы удалить в ней все файлы\папки и оставить только один нужный, мне каталог или файл?

Чувствую что это как-то можно сделать не перечисляя все файлы, но не знаю как )
Читал ман но что-то так и не выходит, подскажите на примере плс
Спасибо сказали:
Аватара пользователя
Nigga
Сообщения: 160
ОС: Debian GNU/Linux

Re: о работе в bash

Сообщение Nigga »

rm -r `ls | grep -v файл_который_надо_оставить`
wazzup Dog?
Спасибо сказали:
KDimanB
Сообщения: 143
ОС: Debian (squeeze), Slax LiveCD

Re: о работе в bash

Сообщение KDimanB »

Удалить все файлы (и каталоги), запрашивая подтверждение на каждый файл:
rm -rfi *


Но это изврат. Тут без "find" не обойтись.
Вам сюда.
Спасибо сказали:
beer21
Сообщения: 5
ОС: winxpsp3

Re: о работе в bash

Сообщение beer21 »

благодарю, попробую
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: о работе в bash

Сообщение drBatty »

beer21 писал(а):
10.09.2009 17:50
Чувствую что это как-то можно сделать не перечисляя все файлы, но не знаю как )
Читал ман но что-то так и не выходит, подскажите на примере плс

что может быть проще???
найти все файлы кроме одного и удалить найденное!
дословно переводим на англ.

Код: Выделить всё

find . -depth \! -path "./robots.txt" -exec rm -rv {} \;

тут всё тривиально, за исключением того, что я обычно сначала пробую без -exec... мало-ли что...
И ещё про -depth - это обход подкаталогов в обратном порядке, сначала киляем все внутренности, потом подкаталог, потом сам каталог, потом...
Ну и в конце rm пытается кильнуть '.', но система её обламывает - такое удалять нельзя :)
в итоге остаётся только текущий каталог и нужный файл.

PS: мне тут попалась немного другая задача - нужные файлы были не в текущем, а в подкаталогах - думать было лень,
я кильнул только файлы (-type f), а потом кильнул все пустые каталоги (-depth -type f -empty). остались только каталоги с нужными файлами.
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: о работе в bash

Сообщение drBatty »

Diman писал(а):
10.09.2009 18:05
Но это изврат. Тут без "find" не обойтись.
Вам сюда.

там тоже изврат. к тому-же несколько более сложный случай обсуждается. в данном случае нет никакой надобности ни в циклах, ни тем-боле в моих извращенских sed-скриптах ;)
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
sash-kan
Администратор
Сообщения: 13939
Статус: oel ngati kameie
ОС: GNU

Re: о работе в bash

Сообщение sash-kan »

beer21 писал(а):
10.09.2009 17:50
Какую комманду надо ввести чтобы удалить в ней все файлы\папки и оставить только один нужный, мне каталог или файл?
$ rm !(нужный_файл)
поначалу лучше предварительно сделать команду ls с тем же аргументом. чтоб видно было, что удалится именно то, что нужно:
$ ls !(нужный_файл)

p.s. это bash. не sh, не zsh, не csh, не и т.д.
p.p.s. естественно, можно и маски использовать: ls !(*.png)
p.p.p.s. man bash. есть что почитать.
Писать безграмотно - значит посягать на время людей, к которым мы адресуемся, а потому совершенно недопустимо в правильно организованном обществе. © Щерба Л. В., 1957
при сбоях форума см.блог
Спасибо сказали:
Аватара пользователя
Rootlexx
Бывший модератор
Сообщения: 4459
Статус: GNU generation
ОС: Debian GNU/Linux

Re: о работе в bash

Сообщение Rootlexx »

Код: Выделить всё

mv {,.}имя_файла
rm *
mv {.,}имя_файла
:).
Спасибо сказали:
Аватара пользователя
sash-kan
Администратор
Сообщения: 13939
Статус: oel ngati kameie
ОС: GNU

Re: о работе в bash

Сообщение sash-kan »

Rootlexx
$ ls -a
. ..
$ touch .file
$ ls -a
. .. .file
$ rm *
$ ls -a
. ..

гыгы.
p.s. описана вполне реальная ситуация.
Писать безграмотно - значит посягать на время людей, к которым мы адресуемся, а потому совершенно недопустимо в правильно организованном обществе. © Щерба Л. В., 1957
при сбоях форума см.блог
Спасибо сказали:
beer21
Сообщения: 5
ОС: winxpsp3

Re: о работе в bash

Сообщение beer21 »

воспользовался способом nigga, получилось)


Diman писал(а):
10.09.2009 18:05
Вам сюда.

спасибо за ссылку, там хорошее вики где описан смысл непонятных мне {}\|""~`` )))

drBatty писал(а):
10.09.2009 20:48
PS: мне тут попалась немного другая задача - нужные файлы были не в текущем, а в подкаталогах - думать было лень,
я кильнул только файлы (-type f), а потом кильнул все пустые каталоги (-depth -type f -empty). остались только каталоги с нужными файлами.

а не скажете как бы перетащить\скопировать папку\файл на каталог выше? Например у меня есть папка test в папке forum которая, в свою очередь, лежит в папке site, как мне, находясь в каталоге forum, переместить\скопировать папку test в папку site? (извините за дурацкий вопр))
Спасибо сказали:
Аватара пользователя
Denjs
Сообщения: 1685
ОС: SuSe 10.2

Re: о работе в bash

Сообщение Denjs »

<offtop>предлагаю автору поставить на удаленном сервере MC</offtop> ^_^
QDroid - Среда исполнения и фреймворк для QtScript.
OTPD - Открытые драйвера промышленных принтеров чеков и этикеток (кроссплатформенная подсистема печати).
Спасибо сказали:
Аватара пользователя
SLEDopit
Модератор
Сообщения: 4823
Статус: фанат консоли (=
ОС: GNU/Debian, RHEL

Re: о работе в bash

Сообщение SLEDopit »

beer21 писал(а):
10.09.2009 23:51
а не скажете как бы перетащить\скопировать папку\файл на каталог выше?

Код: Выделить всё

cp file ../
cp -r dir ../
mv file ../
mv dir ../
beer21 писал(а):
10.09.2009 23:51
Например у меня есть папка test в папке forum которая, в свою очередь, лежит в папке site, как мне, находясь в каталоге forum, переместить\скопировать папку test в папку site?

Код: Выделить всё

[00:09]deb:~ $ mkdir -p site/forum/test
[00:09]deb:~ $ cd site/forum
[00:09]deb:~/site/forum $ pwd
/home/user/site/forum
[00:09]deb:~/site/forum $ ls
test
[00:09]deb:~/site/forum $ mv test ../
[00:10]deb:~/site/forum $ ls
[00:10]deb:~/site/forum $ ls ../
forum  test
UNIX is basically a simple operating system, but you have to be a genius to understand the simplicity. © Dennis Ritchie
The more you believe you don't do mistakes, the more bugs are in your code.
Спасибо сказали:
beer21
Сообщения: 5
ОС: winxpsp3

Re: о работе в bash

Сообщение beer21 »

Denjs писал(а):
10.09.2009 23:54
<offtop>предлагаю автору поставить на удаленном сервере MC</offtop> ^_^

миднайт поставить наверно можно, но хочется пошире раскрыть для себя потенциал консоли, интуитивно чую что он великъ )

SLEDopit писал(а):
11.09.2009 00:11
beer21 писал(а):
10.09.2009 23:51
а не скажете как бы перетащить\скопировать папку\файл на каталог выше?

Код: Выделить всё

cp file ../
cp -r dir ../
mv file ../
mv dir ../
beer21 писал(а):
10.09.2009 23:51
Например у меня есть папка test в папке forum которая, в свою очередь, лежит в папке site, как мне, находясь в каталоге forum, переместить\скопировать папку test в папку site?

Код: Выделить всё

[00:09]deb:~ $ mkdir -p site/forum/test
[00:09]deb:~ $ cd site/forum
[00:09]deb:~/site/forum $ pwd
/home/user/site/forum
[00:09]deb:~/site/forum $ ls
test
[00:09]deb:~/site/forum $ mv test ../
[00:10]deb:~/site/forum $ ls
[00:10]deb:~/site/forum $ ls ../
forum  test


благодарю за оперативность, оказалось оч просто
Спасибо сказали:
Аватара пользователя
Rootlexx
Бывший модератор
Сообщения: 4459
Статус: GNU generation
ОС: Debian GNU/Linux

Re: о работе в bash

Сообщение Rootlexx »

sash-kan писал(а):
10.09.2009 22:11
Rootlexx
$ ls -a
. ..
$ touch .file
$ ls -a
. .. .file
$ rm *
$ ls -a
. ..

гыгы.
p.s. описана вполне реальная ситуация.

Код: Выделить всё

alexey@desktop:~/Видео$ ls -a
.  ..
alexey@desktop:~/Видео$ touch .test
alexey@desktop:~/Видео$ ls -a
.  ..  .test
alexey@desktop:~/Видео$ rm *
rm: невозможно удалить `*': No such file or directory
alexey@desktop:~/Видео$ ls -a
.  ..  .test
alexey@desktop:~/Видео$ shopt dotglob
dotglob            off
alexey@desktop:~/Видео$

Таки всё нормально. Не у всех опция dotglob установлена.
Спасибо сказали:
Аватара пользователя
sash-kan
Администратор
Сообщения: 13939
Статус: oel ngati kameie
ОС: GNU

Re: о работе в bash

Сообщение sash-kan »

Rootlexx писал(а):
11.09.2009 02:57
опция dotglob
ну-у, так нечестно (улыбка). я ждал другого ответа: «не может быть!»

p.s. а shopt -s dotglob я тоже по умолчанию нигде не использую. но иногда случается необходимость…
Писать безграмотно - значит посягать на время людей, к которым мы адресуемся, а потому совершенно недопустимо в правильно организованном обществе. © Щерба Л. В., 1957
при сбоях форума см.блог
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: о работе в bash

Сообщение drBatty »

beer21 писал(а):
10.09.2009 23:51
Например у меня есть папка test в папке forum которая, в свою очередь, лежит в папке site, как мне, находясь в каталоге forum, переместить\скопировать папку test в папку site? (извините за дурацкий вопр))

Код: Выделить всё

cp -rv site/forum/test site

Rootlexx писал(а):
10.09.2009 21:44
mv {,.}имя_файла
rm *
mv {.,}имя_файла

оригинально. я делал не так,

Код: Выделить всё

mv file.xxx ..; rm *; mv ../file.xxx .


sash-kan писал(а):
11.09.2009 05:33
опция dotglob
ну-у, так нечестно (улыбка). я ждал другого ответа: «не может быть!»

вот тем-то она и опасна... :(
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
dergachev
Сообщения: 847
ОС: archlinux

Re: о работе в bash

Сообщение dergachev »

drBatty писал(а):
11.09.2009 09:22
Rootlexx писал(а):
10.09.2009 21:44
mv {,.}имя_файла
rm *
mv {.,}имя_файла

оригинально. я делал не так,

Код: Выделить всё

mv file.xxx ..; rm *; mv ../file.xxx .
Но такой подход не работает в / :happy:

А можно я тоже тогда спрошу - как удалить/скопировать/переместить все файлы, включая скрытые? А то ".*" включает ".." :crazy:
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: о работе в bash

Сообщение drBatty »

dergachev писал(а):
11.09.2009 09:55
Но такой подход не работает в /

вы в корне делаете rm *?
оригинально...
dergachev писал(а):
11.09.2009 09:55
А можно я тоже тогда спрошу - как удалить/скопировать/переместить все файлы, включая скрытые? А то ".*" включает ".."

.* включает ТОЛЬКО скрытые, ВСЕ файлы включает шаблон (и пробелы и точки - важны!)
.. и . тоже относится к файлам, что в этом такого? обычные файлы, что вам не нравится? то-что они сами создаются, и их не удаляет rm -r ? ну и что? копируются они прекрасно, так-же там можно искать. Не нравится - исключите. Выше есть 4+ варианта - как это делать.
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
t.t
Бывший модератор
Сообщения: 7390
Статус: думающий о вечном
ОС: Debian, LMDE

Re: о работе в bash

Сообщение t.t »

sash-kan писал(а):
10.09.2009 21:42
beer21 писал(а):
10.09.2009 17:50
Какую комманду надо ввести чтобы удалить в ней все файлы\папки и оставить только один нужный, мне каталог или файл?
$ rm !(нужный_файл)
поначалу лучше предварительно сделать команду ls с тем же аргументом. чтоб видно было, что удалится именно то, что нужно:
$ ls !(нужный_файл)

p.s. это bash. не sh, не zsh, не csh, не и т.д.
p.p.s. естественно, можно и маски использовать: ls !(*.png)
p.p.p.s. man bash. есть что почитать.
Насколько я помню, сначала нужно shopt -s extglob (у меня в .basrc прописано).
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
Спасибо сказали:
Аватара пользователя
t.t
Бывший модератор
Сообщения: 7390
Статус: думающий о вечном
ОС: Debian, LMDE

Re: о работе в bash

Сообщение t.t »

beer21 писал(а):
11.09.2009 00:28
Denjs писал(а):
10.09.2009 23:54
<offtop>предлагаю автору поставить на удаленном сервере MC</offtop> ^_^
миднайт поставить наверно можно, но хочется пошире раскрыть для себя потенциал консоли, интуитивно чую что он великъ )
Правильно чуете. Вообще, mc -- костыль для тех, кто не хочет освоить нормальную полноценную работу в командной строке. Т.е. в отдельных редких случаях может быть оправдано разово им воспользоваться (например, мне как-то понадобилось для работы с файлами, имевшими иноязычные имена, т.е. с буквами, которых нет в моих раскладках клавиатуры), но для постоянной работы он непригоден.
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
Спасибо сказали:
Аватара пользователя
t.t
Бывший модератор
Сообщения: 7390
Статус: думающий о вечном
ОС: Debian, LMDE

Re: о работе в bash

Сообщение t.t »

drBatty писал(а):
11.09.2009 10:47
dergachev писал(а):
11.09.2009 09:55
А можно я тоже тогда спрошу - как удалить/скопировать/переместить все файлы, включая скрытые? А то ".*" включает ".."
.* включает ТОЛЬКО скрытые, ВСЕ файлы включает шаблон (и пробелы и точки - важны!)
.. и . тоже относится к файлам, что в этом такого? обычные файлы, что вам не нравится? то-что они сами создаются, и их не удаляет rm -r ? ну и что? копируются они прекрасно, так-же там можно искать. Не нравится - исключите. Выше есть 4+ варианта - как это делать.
Есть один частовстречающийся вариант: .[^.]*

На самом деле он не совсем корректен, т.к. под него не подпадают _все_ имена, начинающиеся с двух точек. Правильнее будет так: .[^.]* ..?*
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
Спасибо сказали:
Аватара пользователя
sash-kan
Администратор
Сообщения: 13939
Статус: oel ngati kameie
ОС: GNU

Re: о работе в bash

Сообщение sash-kan »

t.t писал(а):
11.09.2009 12:38
Насколько я помню, сначала нужно shopt -s extglob (у меня в .basrc прописано).
в /etc/bash_completion присутстует включение этой опции.

beer21 писал(а):
10.09.2009 17:50
Какую комманду надо ввести чтобы удалить в ней все файлы\папки и оставить только один нужный, мне каталог или файл?
кстати, ещё вариант:
$ GLOBIGNORE=*.png:*.gif
$ rm *
удалит все файлы кроме имеющих суффиксы .png и .gif. кстати, дот-файлы тоже попадут под паттерн «*» и будут удалены.
и вообще наличие этой переменной (даже пустой) действует аналогично shopt -s dotglob (вот вам пятый или какой там по счёту вариант).
т.е., когда нужно «вернуться назад», надо не просто
$ GLOBIGNORE=
а
$ unset GLOBIGNORE
(или GLOBIGNORE=.* — умолчальное поведение шелла).
Писать безграмотно - значит посягать на время людей, к которым мы адресуемся, а потому совершенно недопустимо в правильно организованном обществе. © Щерба Л. В., 1957
при сбоях форума см.блог
Спасибо сказали:
Аватара пользователя
sash-kan
Администратор
Сообщения: 13939
Статус: oel ngati kameie
ОС: GNU

Re: о работе в bash

Сообщение sash-kan »

t.t писал(а):
11.09.2009 12:58
Т.е. в отдельных редких случаях может быть оправдано разово им воспользоваться (например, мне как-то понадобилось для работы с файлами, имевшими иноязычные имена, т.е. с буквами, которых нет в моих раскладках клавиатуры), но для постоянной работы он непригоден.
для таких редких случаев можно воспользоваться readline-вским шорткатом M-* (alt+* либо escape, затем *). в строку редактирования будут подставлены все возможные на данном этапе комплишены.
пример:
$ ls
fileႡႢ.pdf fileႣႤႥ.pdf
набираю команду (не нажимая в конце enter):
$ ls file
в этот момент нажимаю alt+* и командная строка приобретает вид:
$ ls fileႡႢ.pdf fileႣႤႥ.pdf

вывод: даже для такого редкого случая файловый менеджер не нужен.
Писать безграмотно - значит посягать на время людей, к которым мы адресуемся, а потому совершенно недопустимо в правильно организованном обществе. © Щерба Л. В., 1957
при сбоях форума см.блог
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: о работе в bash

Сообщение drBatty »

t.t писал(а):
11.09.2009 12:58
Правильно чуете. Вообще, mc -- костыль для тех, кто не хочет освоить нормальную полноценную работу в командной строке. Т.е. в отдельных редких случаях может быть оправдано разово им воспользоваться (например, мне как-то понадобилось для работы с файлами, имевшими иноязычные имена, т.е. с буквами, которых нет в моих раскладках клавиатуры), но для постоянной работы он непригоден.

+1
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
t.t
Бывший модератор
Сообщения: 7390
Статус: думающий о вечном
ОС: Debian, LMDE

Re: о работе в bash

Сообщение t.t »

sash-kan писал(а):
11.09.2009 17:17
t.t писал(а):
11.09.2009 12:38
Насколько я помню, сначала нужно shopt -s extglob (у меня в .basrc прописано).
в /etc/bash_completion присутстует включение этой опции.
Спасибо, давно туда не заглядывал. Впрочем, .bashrc у меня кочует с машины на машину ещё с woody. Сегодня обнаружил там комментарий в koi8. (:
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
Спасибо сказали:
Аватара пользователя
t.t
Бывший модератор
Сообщения: 7390
Статус: думающий о вечном
ОС: Debian, LMDE

Re: о работе в bash

Сообщение t.t »

sash-kan писал(а):
11.09.2009 17:48
t.t писал(а):
11.09.2009 12:58
Т.е. в отдельных редких случаях может быть оправдано разово им воспользоваться (например, мне как-то понадобилось для работы с файлами, имевшими иноязычные имена, т.е. с буквами, которых нет в моих раскладках клавиатуры), но для постоянной работы он непригоден.
для таких редких случаев можно воспользоваться readline-вским шорткатом M-* (alt+* либо escape, затем *). в строку редактирования будут подставлены все возможные на данном этапе комплишены.
пример:
$ ls
file**.pdf file***.pdf
набираю команду (не нажимая в конце enter):
$ ls file
в этот момент нажимаю alt+* и командная строка приобретает вид:
$ ls file**.pdf file***.pdf

вывод: даже для такого редкого случая файловый менеджер не нужен.
Я ведь не сказал "может быть необходим", а сказал "в отдельных редких случаях может быть оправдано разово им воспользоваться". В том конкретном случае файлов было много, а обрабатывать их нужно было выборочно -- потому гораздо быстрее было ткнуть на кнопку в mc, нежели удалять из комстроки лишние подстановки. Именно для таких редких случаев его для подстраховки и держу: когда использование универсальных решений или создание специализированных элементарно не оправдано. Как постоянный инструмент считаю mc вредным.
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
Спасибо сказали:
dergachev
Сообщения: 847
ОС: archlinux

Re: о работе в bash

Сообщение dergachev »

drBatty писал(а):
11.09.2009 10:47
dergachev писал(а):
11.09.2009 09:55
Но такой подход не работает в /

вы в корне делаете rm *?
оригинально...
Ну шутю я, шутю. Математика из себя строю.
Спасибо, много интересного узнал в этой теме.
Спасибо сказали:
beer21
Сообщения: 5
ОС: winxpsp3

Re: о работе в bash

Сообщение beer21 »

Еще раз благодарю за все представленные решения, возник еще такой вопрос - как раздать нужные права папке, чтобы это также касалось всех подпапок и\или файлов? И как быть, если например надо раздать одни права тем подпапкам\файлам, а другие иным?
Спасибо сказали:
dergachev
Сообщения: 847
ОС: archlinux

Re: о работе в bash

Сообщение dergachev »

как раздать нужные права папке, чтобы это также касалось всех подпапок и\или файлов?

Код: Выделить всё

chown 755 папко -R
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: о работе в bash

Сообщение drBatty »

dergachev писал(а):
13.09.2009 22:37
chown 755 папко -R

не, регулярным файлам +x поставится...
find . -type f -exec chmod 644 {} \; -o -type d -exec chmod 755 {} \;
что-то такое пойдёт, хотя я не проверил...
у мну есть на другой машине алиас, только я не помню что-там. А простого способа, к сожалению, я не знаю.
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали: