Linux командной строки лучшие практики и советы?


112

Я хотел бы открыть дискуссию, в которой будут собраны лучшие практики и советы вашей командной строки Linux (CLI).

Я искал такое обсуждение, чтобы поделиться комментарием ниже, но не нашел ни одного, следовательно, этот пост.

Я надеюсь, что все мы могли бы извлечь уроки из этого.

Вы можете поделиться своими советами по Bash, grep, sed, AWK, / proc и всеми другими связанными системным администрированием Linux / Unix, а также с рекомендациями по программированию оболочки для всех нас.


Почему только Linux? Многие советы могут быть полезны практически для всех разновидностей Unix.
Mouviciel

Этот вопрос может быть довольно широким - для работы с Linux / Unix достаточно рекомендаций, чтобы заполнить целые книги ...
Jonik

Я согласен, что советы по Unix, которые могут быть применены к Linux, также очень приветствуются, я написал Linux, потому что A. Это то, с чем мы здесь работаем. B. потому что это получает более широкую общественную известность чем unix в последние годы.
Максим Векслер

Я думаю, что это хорошая идея - составить список самых полезных и интересных команд, которые люди используют.

Являются ли какие-либо из них актуальными? refspecs.freestandards.org

Ответы:


111

Используйте экран , бесплатный мультиплексор терминала, разработанный GNU Project, который позволит вам иметь несколько терминалов в одном.

Вы можете начать сеанс, и ваши терминалы будут сохранены, даже если ваше соединение потеряно, поэтому вы можете продолжить позже или из дома.


2
Наиболее распространенные переключатели, которые я использую: «screen -D -R» для отключения и возобновления моего последнего сеанса экрана и «screen -x» для просмотра одного и того же сеанса экрана из нескольких входов в систему. Кроме того, получите хороший .screenrc от dotfiles.org/.screenrc
Ник Деверо

4
Еще одна приятная вещь в screen - это то, что вы можете поделиться терминалом с другими людьми, когда вы хотите что-то сотрудничать, используя screen -x
gareth_bowles

101

SSH!
SSH - это команда богов - я думаю, что это самая ценная команда для изучения. Параметры могут быть довольно пугающими, но мне кажется, что я постоянно учусь использовать новые параметры командной строки для SSH, которые я никогда не считал необходимыми. Возможно, я использовал их всех в этот момент.

Чем больше вы его используете, тем больше вы узнаете об этом. Вы можете использовать это, чтобы сделать некоторые изумительные вещи.

Примечание. ВСЕ эти вещи можно выполнять удаленно, без настройки на вашем сервере, за исключением запуска ssh-сервера.

Смонтировать файловую систему через интернет

искать в сети SSHFS

Вперед команды .

Протокол SVN + SSH - это Subversion от удаленного клиента до сервера, на котором не работает ни один DEAMON! Команда SVN запускает сервер через оболочку ssh и передает информацию туда и обратно по существующему каналу. Программа rsync делает то же самое, запускается на сервере без rsync deamon, запуская его через SSH. Легко написать свои собственные файлы bash, чтобы делать подобные трюки.

Цепочка для прохождения через брандмауэры

Я использую это все время, чтобы перепрыгнуть через мой Linux-сервер дома к моему Mac.

Переадресация портов:
кажется лишь умеренно полезной, пока вы не поймете, что можете прыгать через домашний брандмауэр и настраивать маршрутизатор дома с работы, как если бы вы делали это из домашней сети).

Форвард Х запросов:

Это еще один удивительный. Если на удаленной системе запущен X-сервер или нет, вы можете запустить программу X-Windows, и на вашем локальном экране появится окно. Просто используйте переключатель -X, и все!

Поскольку на удаленном сервере не требуется запуск X-сервера, нагрузка на процессор на вашем сервере минимальна, у вас может быть сервер TINY Linux, который обслуживает огромные приложения на вашем мощном игровом ПК под управлением Windows и Cygwin / X.

Конечно, VI и EMACS работают по SSH, но когда я бегу домой, иногда мне хочется большего. Я использую ssh -X для запуска копии Eclipse! Если ваш сервер более мощный, чем ваш ноутбук, у вас прямо на ноутбуке установлен графический интерфейс, но компиляция выполняется на вашем сервере, поэтому не беспокойтесь о загрузке системы.

Запустить в пакетных файлах

(имеется в виду запуск локального командного файла, который «делает вещи» в других системах):

Две вещи объединяются, чтобы сделать это классным. Во-первых, вы можете исключить запросы пароля, используя (более безопасные) ключи шифрования. Во-вторых, вы можете указать команду в интерфейсе командной строки SSH. Я использовал это несколькими интересными способами: например, когда на удаленном сервере происходит сбой компиляции, я вставляю SSH в компьютер и воспроизводю звуковой файл).

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

Встроенный в Mac

И сервер, и клиент встроены в Mac и Linux. В случае Mac и Ubuntu включить сервер так же просто, как найти нужный флажок.

На ПК установите cygwin или cygwin / X (cygwin / X позволит вам перенаправить вывод x-window с вашего компьютера с Linux на ваш компьютер с Windows - он устанавливает X-сервер)

Важные советы / конфигурационный файл

Никогда не используйте порт 22 на брандмауэре. Вы получите много попыток взлома, но оно того не стоит. Просто сделайте так, чтобы брандмауэр перенаправил другой порт на ваш сервер

Существуют широкие возможности конфигурации, которые позволяют значительно упростить команды ssh. Вот мой пример на работе:

Host home
    hostname billshome.hopto.org
    Port=12345
    user=bill
    LocalForward=localhost:1025 mac:22

Когда я набираю «ssh home» (больше ничего), он действует так, как будто я набрал:

ssh -p 12345 bill@billshome.hopto.org

а затем перенаправляет мой локальный порт 1025 на мой системный «mac» дома. Причина в том, что у меня есть другая запись в моем файле:

Host mac
    hostname localhost
    port=1025

так что, как только я сделал «ssh home» и все еще открыл окно, я могу набрать «ssh mac», и компьютер на работе здесь на самом деле попытается подключиться к своему собственному порту 1025, который был перенаправлен на «mac»: 22 "другой командой, поэтому он подключится к моему Mac дома через брандмауэр.

Редактировать - классный скрипт!

Я выкопал старый сценарий, который я просто люблю - должен был вернуться и опубликовать его для всех, кому это может быть интересно. Скрипт называется "authMe"

#!/bin/bash
if [ ! -f ~/.ssh/id_dsa.pub ]
then
    echo 'id_dsa.pub does not exist, creating'
    ssh-keygen -tdsa
fi
ssh $1 'cat >>.ssh/authorized_keys' <~/.ssh/id_dsa.pub

Если у вас есть этот скрипт в вашем домашнем каталоге и есть хост, к которому вы можете подключиться (через ssh), тогда вы можете набрать «./authMe hostName».

При необходимости он создаст для вас пару открытых / закрытых ключей, затем он перейдет по ssh на другой компьютер и скопирует ваш открытый ключ (команда ssh запросит у вас пароль ...)

После этого команда SSH больше не должна запрашивать ваш пароль при подключении к этой удаленной системе, она будет использовать пару открытых / закрытых ключей.

Если ваш удаленный компьютер не всегда безопасен, вам следует подумать об установке «парольной фразы» при появлении запроса.

Вы также можете настроить сервер ssh на дальнем конце, чтобы запретить использование текстовых паролей (только ключей) для дополнительной безопасности.


4
+1 очень хороший и компактный пост
Карстен

2
Небольшая заметка о SSH через порт 22: если у вас есть хороший пароль root и у ваших пользователей нет ужасных паролей, достаточно просто запустить fail2ban (или что-то подобное), чтобы не допустить попыток взлома. Мне было очень неприятно держать SSH на другом порту.
Дэвид Волевер

1
Иногда это может раздражать, но объем подключений был просто страшным. Я знаю, что они не должны проходить, но это похоже на то, как если бы кто-то подходил к вашему дому и теребил каждую ручку двери каждую минуту - просто нервировал.

В настоящее время в большинстве версий ssh ​​есть встроенная версия вашей последней команды, она называется ssh-copy-id, и это так же просто, какssh-copy-id user@someserver
JamesHannah

Другой способ сделать трюк с ssh mac - это использовать директиву ProxyCommand в вашем файле .ssh / config. Host mac ProxyCommand ssh -q home "nc% h% p" Это запустит netcat (nc) дома и перенаправит ваше ssh-соединение напрямую на mac. Я считаю, что их легче связать (например, если вам нужно подключиться к «дому», чтобы добраться до «рабочего бастиона», чтобы добраться до «рабочего веб-сервера».
toppledwagon

73

Я люблю использовать

cd -

переключиться на предыдущий каталог. Очень полезно!


6
Я никогда не знал этого! Спасибо! В связи с этим pushd и popd делают что-то похожее, создавая стек dirs. Подобные трюки помогают, когда вы перемещаетесь по глубокой структуре dir.

Это чистое просвещение.
Мануэль Феррерия

69

Я недавно обнаружил pvкоманду (просмотрщик каналов), которая похожа на cat, но с деталями передачи.

Так что вместо

$ gzip -c access.log > access.log.gz

Вы можете использовать

$ pv access.log | gzip > access.log.gz
611MB 0:00:11 [58.3MB/s] [=>      ] 15% ETA 0:00:59

Так что вместо того, чтобы знать, когда закончится ваша операция, теперь вы будете знать!

Предоставлено Петерис Круминьш


$ gzip -c access.log> access.log.gz Почему бы просто: $ gzip access.log

О, это работает :) Я просто взял пример с сайта Петерис.
Ник Деверо

Это похоже на старый добрый tee(1).
Даниэль С. Собрал,

Чрезвычайно полезная утилита, о которой я всегда забываю :-(
Патрик


46

Нажмите Ctrl-R и начните вводить команду (или любую ее часть) - она ​​ищет историю команд. Повторное нажатие Ctrl-R приведет к переходу к следующему совпадению, Enter выполнит текущую отображаемую команду, и стрелка вправо (по крайней мере) позволит вам сначала отредактировать ее.

$ (reverse-i-search)`svn': svn status

Я использовал Linux около 7 лет в качестве основной ОС, прежде чем узнал об этом, но теперь, когда я это знаю, это очень удобно.


Благодарю. Я использовал обратный поиск, но не смог понять, как перейти к следующему матчу.
Адам

Ctrl-S переходит к следующему совпадению. Возможно, вам придется stty -ixonсначала отключить значение управления потоком XON / XOFF (это также делает Ctrl-Q доступным, по умолчанию он сопоставлен с Ctrl-V-цитируемой вставкой, но вы можете изменить его на что-то другое). ). Смотрите man sttyи man readlineдля получения дополнительной информации. sttyКоманда может быть добавлена в ваш~/.bashrc
Dennis Williamson

45

Командная строка - забавная вещь. Я думаю, что вы можете многому научиться только самостоятельно, а все остальное вы узнаете случайно, наблюдая за кем-то, использующим командную строку.

Я годами использовал оболочку, кропотливо набирая имена каталогов вручную. Однажды я наблюдал, как друг бездельничал в системе, и он продолжал нажимать клавишу табуляции. Я спросил "почему ты нажимаешь на вкладку?" Ответ: он пытается завершить каталог или имя файла. Кто бы мог догадаться - вкладка пополнения! Введите немного файла или каталога, нажмите вкладку, и он попытается завершить то, что вы ввели (хотя поведение зависит от того, какая оболочка).

Однажды, сказал друг, смотрел на меня в командной строке и смотрел, как я набираю что-то вроде:

coryking@cory ~/trunk/mozi $ pushd /etc
/etc ~/trunk/mozi
coryking@cory /etc $ popd
~/trunk/mozi
coryking@cory ~/trunk/mozi $

Кто бы мог догадаться !? Он никогда не знал о popd/ pushd. Думаю, мы даже ...


1
Для меня завершение табуляции кажется чем-то «очевидным», очень простым, но я также никогда не знал о popd / pushd. Действительно смешно. :)
Jonik

3
Также посмотрите этот ответ, чтобы иметь возможность выполнять табуляцию намного больше, чем команды, файлы и каталоги: stackoverflow.com/questions/603696//603919#603919
Jonik

1
Это правда. Я узнал об обратном поиске истории в bash (ctrl-r), наблюдая за кем-то. Позже я понял, что это была функция readline и работал аналогично в других программах, включающих readline (mysql, gdb, python -i, clisp и т. Д.).
sigjuice

2
Как вы могли использовать «оболочку» годами и не знать о завершении вкладки?
Пресстомация

При работе с pushd / popd не забудьте упомянуть команду dirs . Он показывает, что находится в стеке pushd / popd.
SLM

41

Выучи Vim.

Это (возможно) лучший редактор, но, безусловно, лучший редактор, доступный на голом сервере Linux.


1
gvim также лучший файловый браузер на windows;)

Это также чрезвычайно полезно, так как, узнав vim, вы можете перевести большинство оболочек в режим vi, и навигация станет чрезвычайно простой и быстрой
Patrick

38

Иногда полезно оставить работающую программу даже после выхода из системы. Я видел некоторые решения, которые используют nohup или даже screen для этой цели. Самое простое из известных мне:

$ your_command_here & disown

Вы также можете отсоединить запущенную программу:

$ your_command_here
# Press <Control-Z> to stop the program and bring it to background:
$ bg
$ disown

6
Использование экрана прекрасно, потому что вы можете «переподключиться» к этому приложению из любого места позже.
Пресмация

+1, я не слышал об отречении.
user18911

То же самое отрекаюсь, хотя я уже делаю то же самое с экраном
Энди

38

Когда я хочу убедиться, что я использую фактическую команду, а не псевдоним, я использую начальную обратную косую черту:

\rm -rf ~/tmp

это то же самое, что "команда rm -rf ~ / tmp"?
Максим Векслер

Я не знал «команду», но она выглядит так же.
Mouviciel

4
Ну, да, если только «команда» не является псевдонимом, в этом случае вам лучше использовать \ command rm -rf ~ / tmp, в этом случае \ rm -rf ~ / tmp лучше
Jamol

@presario и вы думаете, что можно было бы сделать псевдоним для "/"? Как жаль, что я не могу высказать комментарии :)

Смотрите также похожую команду " builtin".
Деннис Уильямсон

38

Этот совет сделает ваш CLI более удобным (по крайней мере, для меня):

создайте файл ~ / .inputrc со следующим содержимым:

"\e[A": history-search-backward
"\e[B": history-search-forward

Перезагрузите Bash (например, набрав "Exec Bash"). Когда вы набираете префикс команды и нажимаете стрелку вверх, вы просматриваете команды, начиная с вашего префикса, например, если вы набрали ssh, он покажет ваши прежние соединения с удаленными оболочками. Если ваша подсказка пуста, то стрелка вверх будет просматривать историю обычным способом.


3
Обычно я связываю их с \ e [5 ~ и \ e [6 ~ (он же pageup и pagedown) вместо перепривязывания стрелок, но это удобнее, чем Ctrl-R / Ctrl-S :)
ephemient

+1. Я привязал их к F8 и Shift-F8 для имитации cmd.exe, но тот же принцип применим.
user18911

4
+1 заexec bash
Деннис Уильямсон

Также man readline
полезно

Вы также bind -f ~/.inputrcможете перезагрузить inputrc без необходимости запуска нового bash и уничтожения текущей среды.
Патрик

36

Используйте &&вместо ;выполнения нескольких команд одновременно. Он останавливается при возникновении ошибки и не выполняет другие команды.

Классический пример:

./configure && make && make install

1
Эта практика так недооценена! Это должно быть стандартной практикой - заканчивать каждую строку скрипта оболочки && и использовать «true» в качестве последней команды.
user18911

3
смешно то, что я не знал о ';' Команда раньше - я ВСЕГДА использовал '&&'.
Ник Клауэр

4
Вы можете запустить сценарии оболочки с помощью "#! / Bin / sh -e". Это останавливается, если какая-либо строка терпит неудачу.
стрибика

3
Вы можете использовать двойную трубу для предложения "else":dosomething && echo "success" || echo "teh fail"
Деннис Уильямсон

2
Недавно в Planet Debian было замечено, что использование -e в строке shebang - это плохая практика. Вместо этого используйте set -e в теле скрипта. Таким образом, скрипт не работает по-другому, если кто-то запускается с использованием sh $ filename.
ptman

32

Когда я пишу циклы в командной строке в bash, я часто добавляю рискованные команды к команде 'echo'.

for item in items; do echo something-risky; done

Таким образом, я в полной мере вижу «что-то рискованное», прежде чем запускать его. Помогает, когда ваша рискованная команда включает в себя переменные расширения и глобусы. И 'set -x' очень полезен при написании сценариев bash.

'set -x' включает отладку. См. Http://tldp.org/LDP/Bash-Beginners-Guide/html/sect_02_03.html для получения информации об отладке bash.


3
Я тоже это делаю, очень удобный трюк!
user18911

1
+1 Это может быть спасение жизни! или хранитель данных ...
Дэвид Онеилл

31

требование

Вам необходимо проверить максимальную пропускную способность между 2 серверами.


Решение

На СЕРВЕРЕ1 делаем:

nc -u -l 54321 > /dev/null

На СЕРВЕРЕ2 делаем:

dd if=/dev/zero bs=1MB | nc -u SERVER1 54321 &
pid=$(pidof dd)
while (( 1 )); do kill -USR1 $pid; sleep 2; done

Вы увидите вывод, такой как:

182682000000 bytes (183 GB) copied, 1555.74 seconds, 117 MB/s
182920+0 records in
182919+0 records out

Интересным фактором здесь является 117 МБ / с , который показывает фактическую пропускную способность сети.

Пояснение :

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

Копирование по UDP (для предотвращения издержек TCP).

Копирование из памяти (/ DEV / ноль) на SERVER1 в памяти (/ DEV / нуль) на SERVER2, предотвращая таким образом дискового ввода / вывода стать узким местом.


4
Убедитесь, что ssh не настроен на использование сжатия в .ssh / config, хотя. В противном случае вы получите действительно хорошие цифры, которые очень далеки от истины ;-)
Joachim Sauer

Лол да И SSH будет отбивать ваш процессор шифрованием и дешифрованием, что также скинет цифры.

использовать Netcat вместо
Бендина

+1 для netcat. накладные расходы SSH искажают ваши цифры
Mikeage

Рефакторинг для внесения поправок в предложения @saua, @Daniel Von Fange и @bendin. Спасибо за ваши предложения, ребята.
Максим Векслер

23

Видеть структуры цветовых каталогов проще.

alias ls="ls --color=tty"

редактировать

alias ls="ls --color=auto"

5
Я предпочитаю --color = auto, потому что он не отправляет контрольные символы мусора, если перенаправить в файл, вы также можете сделать псевдоним grep = "grep --color = auto", чтобы выделить соответствующие шаблоны.

+1 для --color = auto; может ли кто-нибудь дополнить ответ этим?
Джоник

Я думаю, что tty здесь делает то же самое, что и auto.
Джошудсон

Обновлено, чтобы отразить цвет = авто
Suroot

Как ни странно, раскраска делает вещи намного менее читабельными для меня. Например, желтый на белом не очень хороший выбор.

20

Несколько небольших указателей относительно просмотра журнала:

  1. Вы можете использовать tail -F для продолжения просмотра журнала после его усечения (на примере log4j).
  2. Вы можете использовать меньше: откройте меньше, нажмите SHIFT + F, чтобы имитировать поведение хвоста. Также полезной комбинацией является -S для отключения переноса строк. меньше позволит вам искать в журналах.

1
А также tail -fвы можете смотреть несколько журналов одновременно! Например:tail -f log1.txt -f log2.txt
Стю Томпсон

@StuThompson: Спасибо. не знал этого. Кроме того, вы можете оформить
Максим Векслер

20

Давным- давно я узнал от друга трюк, чтобы легко изменить расширение файла:

mv my_filename.{old,new}

Расширение Shell расширит это до:

mv my_filename.old my_filename.new

Это также может быть использовано для переименования файла другими способами, такими как добавление чего-либо в:

mv my_{,cool_}filename

6
Только убедитесь, что в одну и ту же команду не вставляются подстановочные знаки или другие выражения шаблона, иначе глобус может расшириться до более чем двух аргументов! mv *. {old, new} может привести к действительно удивительным результатам.

Да, согласился - это важное предупреждение :)

2
Вы также можете напечатать, например, ls -l /bin/cзатем нажать Alt-Shift- {, и это завершит что-то вроде ls -l /bin/c{at,h{grp,mod,own,vt},p{,io},sh}вас.
Деннис Уильямсон

19

Используйте «tar xf» для распаковки сжатых архивов. J для bzip2 и z для gzip не нужны, так как tar определит тип файла вашего архива. Ни один из них не является знаком «-» перед аргументами. Вы сэкономите много времени (за тысячелетие ;-)).

Еще лучше использовать unfoo для извлечения любого архива одной командой без лишних аргументов.


Да, у меня есть alias ut="tar xf"- делает извлечение архивов еще проще.
Дэвид Волевер

Это не работает в некоторых дистрибутивах RHEL, если вы их используете.
pvsnp

Новый tar имеет также переключатель «J» для сжатия в архивы xz (на основе 7zip)
Hubert Kario

Или установите unp: packages.debian.org/sid/unp . Я думаю, это похоже на unfoo.
Цитракс

17

Установите пакет завершения bash. Он содержит ряд предопределенных правил завершения для оболочки. Включите его, введя «source / etc / bash_completion», если ваш дистрибутив не делает этого за вас. Затем, например, когда вы заполняете после kpdf, вы увидите только список каталогов и файлов PDF. Это так же умно, как завершать удаленные файлы после scp ssh: // server / XXX (если вы включили логин без пароля).


17

Я постоянно использую эти

ALT-. (ESC +. В некоторых терминалах) копирует последний использованный аргумент (супер-полезный)

CTRL-W удаляет слово

CTRL-L очистить терминал (как команда очистки, но быстрее)

ALT-B (ESC + B в некоторых терминалах) переместиться назад на слово

ALT-F (ESC + F в некоторых терминалах) двигаться вперед на слово

CTRL-E перейти к EOL

CTRL-A перейти к BOL

CTRL-R поиск в истории


1
Спасибо, что поделились ярлыками! Я не получил ALT-B / F для работы в Mac.
Лео Леопольд Герц 준영

Удивительный мужчина ....
Дауд Ахмад Хохар

16

В bash я много пользуюсь ! $ . Он повторяет последний аргумент последней команды:

ls /really/long/command/argument/that/you/dont/want/to/repeat.txt
vi !$

Он запустит ls, а затем, если вы захотите отредактировать его, вам не нужно его повторно печатать, просто используйте! $. Это действительно полезно для длинных путей / имен файлов. Также ! * Повторяет все аргументы предыдущей команды. Я не так часто это использую, но это выглядит полезным.

Я знаю, что они упоминались, но я часто использую vim, screen и cd.

Я забыл ноклобер:

set -o noclobber

От человека Баш :

Если установлено, bash не перезаписывает существующий файл с помощью операторов перенаправления>,> & и <>. Это может быть переопределено при создании выходных файлов с помощью оператора перенаправления> | вместо>.


6
Я не пользуюсь $ !, потому что пальцем очень легко толстеть, но мне нравится нажимать ^ [-. (escape-период), чтобы получить тот же эффект.
Дэвид Волевер

7
В зависимости от вашей клавиатуры и т. Д. Вы можете сделать то Alt-.же самое .
Деннис Уильямсон

Ом, крошечный оргазм, ты Денис!
artifex

14

Переключитесь с bash на zsh , и вы увидите, как ваша производительность улучшится:

  • Действительно интеллектуальное завершение скриптовой вкладки. Он завершает не только командные строки, но и все параметры, имена man-страниц, имена пакетов (для apt-get / emerge и т. Д.) И что у вас есть. И предоставляет полезное объяснение вариантов во время завершения. Все это без использования прокрутки после ввода команды.
  • Табуляция заполнения подстановочных знаков; напишите cat * .txt, нажмите tab и выберите любой файл, который соответствует выражению.
  • Переключайте каталоги, просто набирая их имена.
  • Несколько режимов линейного редактора. Может вести себя как vi или emacs, если хотите.
  • Настраиваемая привязка клавиш позволяет делать все, что вы пожелаете.
  • Тематические подсказки, в том числе возможность размещать подсказку в правой части экрана и автоматически скрывать ее при вводе длинной команды

Google скажет вам еще много преимуществ.


1
Вы должны дать больше, чем ссылку. звучит интересно, но продай это мне, мужик!

Удалось ли им включить поддержку юникода?

@ Кори Хорошо, я просто не хотел заниматься плагиатом, и было излишним писать свои собственные, когда уже столько хороших вещей написано другими :)

@kyku да, есть надлежащая поддержка юникода, так как, может быть, год назад.

выглядит круто. Я сделаю это!

13

Старая школа, перемещение дерева каталогов из одного места в другое, сохранение символических ссылок, разрешений и всего такого хорошего:

tar cBf - . | (cd /destination; tar xvBpf -)

или через сеть

tar cBf - . | rsh foo.com "cd /destination; tar xvBpf -)

Новая школа:

rsync -urltv . /destination

или через сеть

rsync -urltv -e ssh . foo.com:/destination

tar xvBpf - -C /destination== (cd /destination; tar xvBpf -) Немного меньше печатать и легче использовать поверх ssh.
Эфимент

1
-a - это то же самое, что и -rlptgoD - рекурсивно, копировать символические ссылки как символические ссылки, сохранять химические параметры, сохранять временные метки, сохранять группы, сохранять владельцев, копировать файлы устройств и специальные файлы как устройства и специальные файлы. Кроме того, между компьютерами полезна опция -z (сжатие файлов перед отправкой, распаковка после получения). rsync -avz [-e ssh] ваш друг :-)
dr-jan

-Z приносит пользу по сравнению с ssh? Я бы так не думал.
Пол Томблин

rsync -avhЛучше всего на одной машине - hгарантирует, что жесткие ссылки передаются правильно, не превращая каждую ссылку в отдельный файл, хотя, если у вас огромное количество файлов, он может использовать много памяти. rsync -avzh . foo.com/destinationявляется эквивалентом для сети, и обычно вам не нужен, так -e sshкак rsync будет знать, как использовать ssh.
RichVel

На самом деле, в эти дни я используюrsync -aSHuvrx --delete / --link-dest=/backup/$PREV /backup/$HOUR
Пол Томблин

13

Требование : у вас есть каталог, содержащий большой список файлов, которые вы хотели бы удалить. rm -r потерпит неудачу!

пример

find /var/spool/mqueue/ | wc -l
191545
rm -f /var/spool/mqueue/*
-bash: /bin/rm: Argument list too long

Решение :

find /var/spool/mqueue/ -xdev -exec command rm -f '{}' +

Пояснение :

Изменить: Исправление объяснения после комментария @ephemient.

find предоставит аргументы rm по максимально допустимым аргументам. Это позволит rm удалять файлы партиями, что является самым быстрым из известных мне методов без использования операции -delete самой find. Это эквивалентно

find /var/spool/mqueue -xdev -print0 | xargs -0 rm -f

который вы можете найти полезным, если ваш findне поддерживает -exec ... +.


5
Замените \;на +: затем findбудет делать то, что xargsделает по умолчанию, что позволяет группировать аргументы в максимально возможной степени (без превышения предела списка аргументов). Или просто используйте -deleteintead of -exec rm(GNU Findutils необходим для обоих)
ephemient

Хороший совет - я не знал «+».
codeinthehole

@ephemient: Хороший комментарий, я редактировал пост.
Максим Векслер

2
Интересно, я не слышал о «+».
user18911

или просто find ... -delete, если ваша находка так наделена.
Дэвид Волевер

11

Я так часто пользуюсь этими двумя советами, что подумал, что было бы неплохо поделиться:

!foo

Запустит последнюю команду в файле истории, начинающуюся с "foo" (например, я часто использую ее при компиляции !gcc.)

Другой - это сочетание клавиш (Ctrl + O вместо Return), которое выполнит команду И отобразит следующую команду в файле истории. Например, когда я компилирую и тестирую файл, я всегда делаю 3 или 4 команды, выполняю, cd к каталогу теста, запускаю тест, cd к каталогу make-файла. Использование Ctrl + O делает эту задачу намного проще :)

Надеюсь, это поможет!


1
+1 для Ctrl-O
Деннис Уильямсон

10

Как использовать Subversion в Linux без помощи причудливых графических интерфейсов, которые могут быть недоступны.

svn co <repo-url> . # Checks out project into current folder

svn update # Get latest changes from server

svn status # Shows what files have changed locally

svn add <path/filename> # Add some file to the repo

svn commit # Commit your changes to the repo

Это удерживает многих разработчиков от использования Linux, как ни странно.


Rapidsvn - хороший маленький графический интерфейс для svn под Linux.

Конечно, доступно много необычных, мощных графических интерфейсов (например, в IntelliJ IDEA), но мне нравится возможность использовать либо те, либо командную строку (также мощную, но по-разному) - в зависимости от того, что лучше подходит для текущей ситуации
Jonik

Мой любимый на сегодняшний день NautilusSVN (очень похож на TortoiseSVN): code.google.com/p/nautilussvn
user7655

10

Самая упущенная команда старой школы: find

Вчера я исправил ошибку грубых разрешений:

for u in nr dias simonpj; do
   sudo -u $u find . -type d -exec chmod g+s '{}' ';'
done

Да! Изучите команду поиска. Найти смешанный с xargs, sed и awk делает для обработки файлов Джаггернаут!
Джонатон Уотни

Согласовано! Хотя я ничего не помню о sed и awk - мне всегда нужно переучивать это! Я действительно должен распечатать шпаргалку.

Да, но не забывайте использовать -print0 и опцию -0 для xargs, чтобы избежать хитрых проблем, связанных с именами файлов, содержащими необычные символы (например, обратный слеш).
user18911

Да, наверное , половину времени я использую найти это исправить глупые разрешения вещи: chmod 644 $(find . -type f),chmod 755 $(find . -type d)
David Wolever

1
Не забудьте -permопцию, чтобы findнайти файлы, которые имеют определенные права доступа.
Деннис Уильямсон

8

Для таких оболочек, как bashи ksh, вы можете заставить командную строку реагировать на команды навигации, такие как ваш текстовый редактор:

set -o emacs

или же

set -o vi

позволит вам искать в вашей истории и перемещаться по командной строке так, как вы привыкли делать в текстовых файлах (например, в режиме vi нажатие, а ESCзатем набор текста /stringбудет искать в ваших предыдущих командах «строку» - вы можете использовать nи Nдля перемещения между матчами)


Незначительная опечатка: «тестовый редактор» должен быть «текстовым редактором»

8

grep мой друг Шутки в сторону.

Список .rbфайлов, которые содержат текст class foo:

grep -l "class foo" .rb

Список .rbфайлов, которые не содержат текст class foo:

grep -L "class foo" *.rb

Перечислите .rbфайлы, которые не содержат foo или bar (вы можете использовать любое регулярное выражение с -e, но вам нужно экранировать операторы):

grep -L -e "foo\|bar" *.rb

Возможно, вас заинтересует инструмент под названием «ack», который делает то же самое, что и grep, но рекурсивно сканирует только исходные файлы. Попробуйте (это бесплатно): betterthangrep.com

8

Замена оболочки выполняется с помощью ^:

/home/eugene $ ls foo.txt
foo.txt
/home/eugene $ ^ls^rm
rm foo.txt
/home/eugene $ ls foo.txt
ls: cannot access foo.txt: No such file or directory

2
На самом деле я предпочитаю "!!: gs / foo / bar", так как я часто нахожу, что foo упоминается несколько раз в предыдущей команде, и я хочу глобальную замену (например, "mv foo.txt foo.bak").
user18911
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.