Linuxコマンドラインのベストプラクティスとヒント


112

Linuxコマンドライン(CLI)のベストプラクティスとヒントを蓄積するディスカッションを開始したいと思います。

以下のコメントを共有するためにそのようなディスカッションを検索しましたが、見つかりませんでした。したがって、この投稿です。

私たち全員がこれから学べることを願っています。

Bashのヒント、grep、sed、AWK、/ proc、およびその他すべての関連するLinux / Unixシステム管理、シェルプログラミングのベストプラクティスを共有してください。


なぜLinuxだけなのか?Unixのほとんどすべての種類で、多くのヒントが役立つ場合があります。
ムービシエル2009年

この質問は、幅広い少しかもしれない- ...全体の本を埋めるためのLinux / Unixのコマンドラインのベストプラクティスに十分にあり
Jonik

Linuxに適用できるUNIXのヒントも大歓迎です。私はLinuxを書いたのです。なぜならA.これがここで取り組んでいることです。B.近年、Unixよりも広く一般に公開されているため。
マキシムVeksler

人々が使用する最も有用で興味深いコマンドのリストをまとめるのは素晴らしいアイデアだと思います。

これらのいずれかが関連していますか? refspecs.freestandards.org

回答:


111

screenを使用します。これは、GNUプロジェクトが開発した無料のターミナルマルチプレクサで、複数のターミナルを1つにまとめることができます。

セッションを開始でき、接続が失われても端末は保存されるため、後で再開したり、自宅から再開したりできます。


2
私が使用する最も一般的なスイッチは、最後の画面セッションを切り離して再開するための「screen -D -R」と、複数のログインから同じ画面セッションを表示するための「screen -x」です。また、dotfiles.org / .screenrcから素敵な.screenrcを入手してください
Nick Devereaux

4
画面についてのもう一つの良いところは、あなたが何かに協力したいときは、画面-x使用して、他の人との端末を共有することができるということです
gareth_bowlesを

101

SSH!
SSHはgodコマンドです。学ぶための最も価値のある総合的なコマンドだと思います。オプションは非常に困難な場合がありますが、SSHに新しいコマンドラインオプションを使用することを常に学んでいるようです。この時点ですべてを使用した可能性があります。

使用すればするほど、それについて学ぶことができます。それを使用していくつかの驚くべきことを行うことができます。

注:これらはすべて、sshサーバーを実行することを除いて、サーバー上でセットアップすることなくリモートで実行できます。

インターネット経由でファイルシステムをマウントする

SSHFSのネットを検索

コマンドを転送します

SVN + SSHプロトコルは、リモートクライアントから、デーモンが実行されていないサーバーへのSubversionです!SVNコマンドは、sshシェルを介してサーバーを起動し、既存のパイプを介して情報をやり取りします。rsyncプログラムも同じことを行い、rsyncデーモンを持たないサーバーに対して、SSHを介してサーバー自体を起動して実行します。独自のbashファイルを作成して、同様のトリックを実行するのは簡単です。

ファイアウォールを通過するチェーン

私はいつもこれを使って、自宅のLinuxサーバーからMacにジャンプします。

転送ポート:
自宅のファイアウォールを通過して自宅のルーターを自宅のネットワーク内から行っているかのように自宅から設定できることに気付くまで、中程度に役立つようです。

Xリクエストの転送:

これもまた素晴らしいものです。Xサーバーがリモートシステムで実行されているかどうかにかかわらず、x-windowsプログラムを実行すると、ローカル画面にウィンドウが表示されます。スイッチ-Xを使用するだけです!

リモートサーバーでXサーバーを実行する必要はないため、サーバーへのCPUの影響は最小限であり、Windowsおよびcygwin / Xを実行する強力なゲームPCに巨大なアプリを提供するTINY Linuxサーバーを使用できます。

もちろん、VIとEMACSはSSHで動作しますが、自宅で実行しているときは、もっと欲しいことがあります。ssh -Xを使用してEclipseのコピーを起動します!サーバーがラップトップよりも強力な場合、ラップトップ上にGUIがありますが、コンパイルはサーバー上で行われるため、システムの負荷について心配する必要はありません。

バッチファイルで実行

(つまり、他のシステムで「処理を行う」ローカルバッチファイルを実行することを意味します):

2つのことが組み合わさって、この1つがクールになります。1つは、(より安全な)暗号化キーを使用して、パスワードプロンプトを削除できることです。2番目は、SSH CLIでコマンドを指定できることです。リモートサーバーでコンパイルが失敗したときのように、これをいくつかの興味深い方法で使用しました。コンピューターにSSHで接続して、サウンドファイルを再生します)。

リモートコマンドからの出力をリダイレクトしてローカルバッチファイル内で使用できるため、サーバーで実行中のコンパイルをローカルで調整することもできます。

Macに内蔵

サーバーとクライアントの両方が、macとlinuxの両方に組み込まれています。MacとUbuntuの場合、サーバーの有効化は正しいチェックボックスを見つけるのと同じくらい簡単です。

PCにcygwinまたはcygwin / Xをインストールします(cygwin / Xを使用すると、x-window出力をLinuxマシンからWindows PCに転送できます-Xサーバーをインストールします)

重要なTips / configファイル

ファイアウォールでポート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」と入力できます。ここで動作しているコンピューターは、実際には「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
Karsten

2
ポート22を介したSSHに関する小さなメモ:優れたrootパスワードがあり、ユーザーがひどいパスワードを持っていない場合、fail2ban(または同様のもの)を実行するだけでクラック試行を防ぐことができます。SSHを別のポートに保持するのは本当に面倒です。
デビッドウォレバー

1
時々いらいらすることもありますが、接続の量は怖いだけでした。私は彼らが通り抜けるはずがないことを知っていますが、それはあなたが誰かがあなたの家まで歩いてドアノブを毎分いじっているようなものです-ただ不安になります。

そこ今どきのsshのほとんどのバージョンでは、あなたの最後のコマンドの組み込みのバージョンは、それを呼び出して、だssh-copy-id、それは同じくらい簡単ですssh-copy-id user@someserver
JamesHannah

「ssh mac」トリックを実行する別の方法は、.ssh / configファイルでProxyCommandディレクティブを使用することです。Host mac ProxyCommand ssh -q home "nc%h%p"これにより、ホームでnetcat(nc)が実行され、ssh接続がMacに直接リダイレクトされます。あなたは「仕事のウェブサーバー」に取得するには「仕事砦」に到達するために「ホーム」に接続する必要がある場合、私は、例えば(チェーンに簡単にそれらを見つける。
toppledwagon

73

私は使うのが好きです

cd -

前のディレクトリに切り替えます。非常に便利!


6
私はこれを知らなかった!ありがとう!関連するメモでは、pushdとpopdは、dirsのスタックを構築することにより、同様のことを行います。これらの種類のトリックは、深いディレクトリ構造をナビゲートするときに役立ちます。

これは全くの啓発です。
マヌエルフェレリア2009年

69

私は最近、pv猫に似ていますが、転送の詳細を含むコマンド(パイプビューアー)を発見しました。

の代わりに

$ 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

だから、あなたの操作がいつ終わるのか分からない代わりに、今あなたは知っているでしょう!

Peteris Krumins提供


$ gzip -c access.log> access.log.gz理由:$ gzip access.log

ああそれは動作します:)私はペテロのウェブサイトから例を取り上げました。
ニックデボラ

それは古き良きように見えますtee(1)
ダニエルC.ソブラル

非常に便利なユーティリティ、私はいつも忘れているもの:
パトリック


46

押してCtrlキーを押しながらRは、コマンド(またはその一部)を入力し始めると-それは、コマンド履歴を検索します。もう一度Ctrl-Rを押すと、次の一致にジャンプし、enterが現在表示されているコマンドを実行し、右矢印(少なくとも)を使用して最初に編集できます。

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

これを学ぶ前に、メインOSとして7年ほどLinuxを使用していましたが、今では知っているので、非常に便利です。


ありがとう。私は逆検索を使用してきましたが、次の試合にジャンプする方法を見つけられませんでした。
アダム

Ctrl-Sは次の一致にジャンプします。stty -ixonXON / XOFFフロー制御の意味をオフにするために最初に行う必要がある場合があります(これにより、Ctrl-Qが使用可能になります。デフォルトでは、Ctrl-V quoted-insertと同じようにマップされますが、別のものに変更できます) )。man sttyおよびman readlineを参照してください。sttyコマンドはあなたに追加することができます~/.bashrc
デニス・ウィリアムソン

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についても知りませんでした。本当に面白い。:)
ジョニック2009年

3
また、この答えは、コマンド、ファイルやディレクトリよりもタブの完全な、より多くのことができるようにするために参照してください。stackoverflow.com/questions/603696//603919#603919
Jonik

1
それは本当です。誰かを見ることで、bashの後方履歴検索(ctrl-r)について学びました。後でそれがreadline機能であることに気付き、readlineを組み込んだ他のプログラム(mysql、gdb、python -i、clispなど)でも同じように機能しました。
sigjuice

2
タブ補完について知らずに、「シェル」を何年も使用できますか?
prestomation

pushd / popdを扱うときは、コマンドdirsに言及することを忘れないでください。pushd / popdスタックの内容を示します。
slm

41

Vimを学ぶ。

これは(ほぼ間違いなく)最高のエディターですが、ほとんどの場合、裸のLinuxサーバーで使用できる最高のエディターです。


1
gvimは、Windowsの最高のファイルブラウザでもあります;)

あなたがVimを知っていれば、あなたはviのモードにほとんどのシェルを置くことができるので、これはまた、非常に有用である、とナビゲーションは非常に簡単かつ迅速になり
パトリック

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
画面を使用すると、後からどこからでもそのアプリに「再接続」できるので便利です。
prestomation

+1、私は嫌悪感を聞いていませんでした。
user18911 09年

同上の再は、否認私はスクリーンで同じことを行うすでにんが
アンディ・

38

エイリアスではなく実際のコマンドを使用することを確認する場合は、先頭にバックスラッシュを使用します。

\rm -rf ~/tmp

これは「command rm -rf〜/ tmp」と同じですか?
マキシムVeksler

「コマンド」は知りませんでしたが、見た目は同じです。
ムービシエル2009年

4
まあ、はい「コマンドは、」あなたが、その場合、\ 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
通常、私はそれらが電子[5〜と\ E [6〜(別名PageUpキーとPAGEDOWN)の代わりに、再バインド矢を\に結合し、それが:)にCtrl-R / Ctrlキーを押しながらSよりも便利である
ephemient

+1。私はこれらをF8およびShift-F8にバインドしてcmd.exeを模倣していますが、同じ原則が適用されます。
user18911 09年


man readlineデフォルトのショートカットを読んで記憶することも教育的です
-SaveTheRbtz

bind -f ~/.inputrc新しいbashを開始して現在の環境を消去することなく、inputrcを再ロードすることもできます。
パトリック

36

複数のコマンドを一度に実行する場合の&&代わりに使用し;ます。エラーが発生すると停止し、他のコマンドを実行しません。

古典的な例:

./configure && make && make install

1
このプラクティスは過小評価されています!シェルスクリプトの各行を&&で終了し、最終コマンドとして「true」を使用するのが標準的な方法です。
user18911 09年

3
面白いのは、「;」について知らなかったことです 前のコマンド-常に「&&」を使用していました。
ニッククラウアー2009年

4
「#!/ bin / sh -e」を使用してシェルスクリプトを開始できます。回線に障害が発生すると、これは停止します。
stribika

3
あなたは、「他の」句のための二重管を使用することができますdosomething && echo "success" || echo "teh fail"
デニスウィリアムソン

2
Planet Debianに関する最近のメモには、シバンの行で-eを使用するのは悪い習慣であるというものがありました。代わりに、スクリプトの本文でset -eを使用します。このように、誰かがたまたまsh $ filenameを使用して実行した場合、スクリプトは異なる動作をしません。
ptman 2009年

32

bashのコマンドラインでループを作成するとき、危険なコマンドの先頭に「echo」コマンドを付けることがよくあります。

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

このようにして、実行をコミットする前に「何か危険な」ものを完全に見ることができます。危険なコマンドに変数展開とグロブが含まれる場合に役立ちます。また、「set -x」は、bashスクリプトを記述するときに非常に便利です。

'set -x'はデバッグを有効にします。bashデバッグの詳細については、http://tldp.org/LDP/Bash-Beginners-Guide/html/sect_02_03.htmlを参照してください。


3
私もこれを行う、非常に便利なトリック!
user18911

1
+1これは命の恩人になることができます!またはデータセーバー...
デビッドオニール

31

要求

2つのサーバー間の最大帯域幅をテストする必要があります。


解決

上のSERVER1行います。

nc -u -l 54321 > /dev/null

SERVER2の操作を行います。

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 MB / sが興味深い要素であり、実際のネットワーク転送帯域幅を示しています。

説明

パケットがネットワーク上を流れ始めると、SERVER2の帯域幅統計を確認できるようになります。これは、2台のサーバー間の実際の最大帯域幅のかなり良い見積もりです。

UDPによるコピー(TCPオーバーヘッドを防ぐため)。

コピーから SERVER1上のメモリ(の/ dev /ゼロ) Server2のメモリは、(を/ dev / null)、従ってボトルネックになってから、ディスクI / Oを防止します。


4
ただし、sshが.ssh / configで圧縮を使用するように構成されていないことを確認してください。そうしないと、真実とはかけ離れた本当に素晴らしい数字が得られます;
ヨアヒム・ザウアー

笑はい。また、SSHがCPUの暗号化と復号化に打撃を与えており、これにより数値も失われます。

代わりにnetcatを使用してください
ベンディン

netcatの場合は+1。SSHのオーバーヘッドにより数値が
歪む

@ saua、@ Daniel Von Fange、および@bendinによる提案を修正するためにリファクタリングされました。ご提案ありがとうございます。
マキシムVeksler

23

カラーディレクトリ構造が見やすくなりました。

alias ls="ls --color=tty"

編集

alias ls="ls --color=auto"

5
--color = autoを好むのは、ファイルにリダイレクトする場合にゴミ制御文字を送信しないためです。エイリアスgrep = "grep --color = auto"を実行して、一致するパターンを強調表示することもできます。

--color = autoの場合は+1。誰かがそれで答えを増やすことができますか?
ジョニック2009年

ここでttyはautoと同じことをすると思います。
joshudson

色を反映するために更新=自動
SUROOT

奇妙なことに、色付けは私にとって物事をずっと読みにくくします。たとえば、白地に黄色は、良い色の選択ではありません。

20

ログの表示に関するいくつかの小さなポインタ:

  1. tail -Fを使用して、ログが切り捨てられた後も監視し続けることができます(例:log4j)。
  2. lessを使用できます:Open less、Shift + Fをクリックしてテールの動作をエミュレートします。また、行の折り返しを無効にする-Sも便利な組み合わせです。lessはログを検索できるようにします。

1
そして、tail -fあなたは一度に複数のログを見ることができます!例:tail -f log1.txt -f log2.txt
ストゥトンプソン

@StuThompson:ありがとう。それを知りませんでした。また、あなたがチェックアウトする場合がありますvanheusden.com/multitailを
マキシムVeksler

20

ファイルの拡張子を簡単に変更するために、友人から長い間トリックを学びました。

mv my_filename.{old,new}

シェル拡張により、これが次のように拡張されます。

mv my_filename.old my_filename.new

これは、次のものに何かを追加するなど、他の方法でファイルの名前を変更するためにも使用できます。

mv my_{,cool_}filename

6
同じコマンドにワイルドカードや他のパターン式を含めないでください。そうしないと、グロブが2つ以上の引数に展開される可能性があります。mv *。{old、new}は、驚くべき結果をもたらす可能性があります。

はい、同意しました-これは重要な警告です:)

2
たとえば、入力してからls -l /bin/cAlt-Shift- {を押すと、これが完了ls -l /bin/c{at,h{grp,mod,own,vt},p{,io},sh}します。
デニスウィリアムソン

19

「tar xf」を使用して、圧縮アーカイブを抽出します。tarはアーカイブのファイルタイプを検出するため、bzip2のjとgzipのzは必要ありません。どちらも引数の前の '-'記号ではありません。多くの時間を節約できます(千年以上;-))。

さらに、unfooを使用して、不要な引数を指定せずに1つのコマンドでアーカイブを抽出してください。


うん、私はalias ut="tar xf"–アーカイブの抽出をさらに簡単にします。
デビッドウォレバー

一部のRHELディストリビューションを使用すると、これは失敗します。
pvsnp

新しいtarには、xz(7zipベース)アーカイブに圧縮するための「J」スイッチもあります
Hubert Kario

または、unp:packages.debian.org/sid/unpをインストールします。unfooに似ていると思います。
ジトラックス

17

bash-completionパッケージをインストールします。シェルの定義済みの完了規則が多数含まれています。ディストリビューションがあなたのためにそれをしない場合は、「source / etc / bash_completion」と入力して有効にします。次に、たとえば、kpdfの後に完了すると、ディレクトリとPDFファイルのリストのみが表示されます。scp ssh:// server / XXXの後にリモートファイルを完了するのと同じくらいスマートです(パスワードなしのログインを有効にした場合)。


17

私はこれらを常に使用しています

ALT-。(ESC +。一部の端末では)最後に使用された引数をコピーします(超便利)

CTRL-Wは単語を削除します

CTRL-Lクリアターミナル(clearコマンドに似ていますが高速です)

ALT-B(一部の端末ではESC + B)単語を後方に移動

ALT-F(一部の端末ではESC + F)は単語を進める

EOLへのCTRL-Eジャンプ

CTRL-A BOLへのジャンプ

履歴でのCTRL-R検索


1
ショートカットを共有していただきありがとうございます!MacでALT-B / Fが動作しませんでした。
レオレオポルドヘルツ준영

素晴らしい男....
ダウドアフマドホッハー

16

bashでは、!$を頻繁に使用します。最後のコマンドの最後の引数を繰り返します。

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

lsが実行されます。編集する場合は、再入力する必要はなく、!$を使用します。これは、長いパス/ファイル名に非常に便利です。また、!*は前のコマンドの引数をすべて繰り返します。私はそれほどそれを使用しませんが、それは便利に見えます。

それらが言及されていることは知っていましたが、vim、screen、cdを使用しています-

noclobberを忘れました:

set -o noclobber

man bashから:

設定されている場合、bashは、>、>&、および<>リダイレクト演算子で既存のファイルを上書きしません。これは、リダイレクト演算子> |を使用して出力ファイルを作成するときに上書きされる場合があります >の代わりに。


6
指を太らせるのは本当に簡単なので、$!は使用しませんが、^ [-を押すのが好きです。(エスケープ期間)同じ効果を取得します。
デビッドウォレバー

7
キーボードなどに応じて、Alt-.同様に行うことができます。
デニスウィリアムソン

OMG、小さなオーガズム、タイデニス!
-artifex

14

bashからzshに切り替えて、生産性が向上することを確認してください。

  • 本当にインテリジェントで、スクリプト可能なタブ補完。コマンドラインだけでなく、すべてのオプション、マニュアルページの名前、パッケージ名(apt-get / emergeなどの場合)、および何が必要かを補完し​​ます。また、完了時のオプションの有用な説明を提供します。このすべては、コマンドが発行された後、スクロールバックスペースを使用しません。
  • ワイルドカードのタブ補完。cat * .txtと入力し、Tabキーを押して、式に一致するファイルを選択します。
  • 名前を入力するだけでディレクトリを切り替えます。
  • いくつかのラインエディターモード。必要に応じて、viまたはemacsのように動作できます。
  • カスタマイズ可能なキーバインディングにより、何でもできます。
  • プロンプト情報を画面の右側に配置し、長いコマンドを入力したときに自動的に非表示にする機能など、テーマに応じたプロンプト

Googleにはさらに多くの利点があります。


1
リンクを追加する必要があります。おもしろそうですが、私に売ってください!

彼らはユニコードサポートを含めることができましたか?

@Cory Alright、盗用したくなかったので、他の人が書いたものがたくさんあるのに自分で書くのは冗長だと感じました:)

@kykuはい、おそらく1年前から適切なUnicodeサポートがあります。

かっこいいね。試してみます!

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よりも使いやすくなりました。
一時的な2009年

1
-aは '-rlptgoD'と同じです。つまり、再帰、シンボリックリンクをシンボリックリンクとしてコピー、パーマを保持、タイムスタンプを保持、グループを保持、所有者を保持、デバイスファイルと特殊ファイルをデバイスおよび特殊ファイルとしてコピーします。また、マシン間では、-z(送信前にファイルを圧縮、受信後に解凍)が便利です。rsync -avz [-e ssh]はあなたの友達です:
dr-jan

-zはsshよりも良いことをしますか?私はそうは思わないでしょう。
ポールトムブリン

rsync -avh1台のマシンで最適です- h各リンクを個別のファイルに変換せずにハードリンクが正しく転送されるようにしますが、膨大な数のファイルがある場合は大量のメモリを使用できます。rsync -avzh . foo.com/destinationこれはネットワークと同等であり、-e sshrsyncが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はバッチでファイルを削除できます。これは、find自体の-delete操作を使用せずに、私が知っている最速の手法です。それは同等です

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

findサポートされていない場合に役立ちます-exec ... +


5
Replace \;with +:その後、デフォルトでfind行われる処理をxargs実行します。これは、可能な限り引数をバッチ処理します(引数リストの制限を超えることはありません)。または単に(両方に必要なGNU Findutils)を使用する-delete-ephemient -exec rm
21:09

良いヒント-私は '+'を知りませんでした。
codeinthehole

@ephemient:良いコメント、投稿を編集しました。
マキシムヴェクスラー

2
興味深いことに、「+」のことは聞いていませんでした。
user18911 09年

またはfind ... -delete、もしあなたの発見がとても恵まれているなら。
デビッドウォレバー

11

この2つのヒントを頻繁に使用するので、共有することをお勧めします。

!foo

「foo」で始まる履歴ファイルの最後のコマンドを起動します(!gccたとえば、コンパイル時によく使用します)。

もう1つはキーボードショートカット(ReturnではなくCtrl + O)です。これにより、コマンドが実行され、履歴ファイルの次のコマンドが表示されます。たとえば、ファイルをコンパイルしてテストするときは、常に3つまたは4つのコマンドを実行し、make、テストのdirにcd、テストを実行、makefileのdirにcdします。Ctrl + Oを使用すると、このタスクが非常に簡単になります:)

この助けを願っています!



10

使用できない可能性のある派手なグラフィカルインターフェイスを使用せずに、LinuxでSubversionを使用する方法。

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は、Linuxでのsvnの素敵な小さなguiです。

多くの派手な、強力なGUIが(のIntelliJ IDEAのもののように)確かにありますが、私はそれらまたはコマンドライン(も強力な、しかしdifferrently)のいずれかの使用の可能性が好き-現在の状況は良く合う方を
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について何も覚えていませんが、常に再学習する必要があります!チートシートを印刷する必要があります。

はい。ただし、xargsで-print0および-0オプションを使用して、異常な文字(バックスラッシュなど)を含むファイル名に関連する厄介な問題を回避することを忘れないでください。
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すると、以前のコマンドで「文字列」が検索されます-を使用nNて移動できます)マッチ間)


ちょっとした誤植:「テストエディター」は「テキストエディター」である必要があります

8

grepは私の友人です。真剣に。

.rbテキストを含むファイルをリストしますclass foo

grep -l "class foo" .rb

テキストを含まない.rbファイルをリストします:class foo

grep -L "class foo" *.rb

fooまたはbarを含まない.rbファイルを一覧表示します(正規表現は-eとともに使用できますが、演算子をエスケープする必要があります)。

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

grepと同じことを行いますが、ソースファイルのみを再帰的にスキャンする「ack」というツールに興味があるかもしれません。試してみてください(無料):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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.