10

それはプログラマーの最初の偉大な美徳です。私たちは皆、一度や二度はちょっとした使い捨てコードでタスクを自動化したことがあります。ワンライナーをタップするのに数秒かかることもあれば、2 秒のタスクを自動化するのに法外な時間を費やして、二度と使用しないこともあります。

再利用するのに十分役立つ小さなハックは何ですか? エイリアスを作成するまで行うには?

注: 回答する前に、BASHまたは perl/ruby のワンライナーの質問を使用して、お気に入りのコマンド ライン トリックにまだ含まれていないことを確認してください。

4

15 に答える 15

13

今日、dotfiles.org でこれを見つけました。とてもシンプルですが、賢いです。自分で考えなかった自分がバカだなと思いました。

###
###   Handy Extract Program
###
extract () {
     if [ -f $1 ] ; then
         case $1 in
             *.tar.bz2)   tar xvjf $1        ;;
             *.tar.gz)    tar xvzf $1     ;;
             *.bz2)       bunzip2 $1       ;;
             *.rar)       unrar x $1     ;;
             *.gz)        gunzip $1     ;;
             *.tar)       tar xvf $1        ;;
             *.tbz2)      tar xvjf $1      ;;
             *.tgz)       tar xvzf $1       ;;
             *.zip)       unzip $1     ;;
             *.Z)         uncompress $1  ;;
             *.7z)        7z x $1    ;;
             *)           echo "'$1' cannot be extracted via >extract<" ;;
         esac
    else
         echo "'$1' is not a valid file"
    fi
}
于 2008-10-07T02:19:15.830 に答える
5

以下は、標準入力の大きな数値の真ん中にカンマを置くフィルターです。

$ cat ~/bin/comma
#!/usr/bin/perl -p

s/(\d{4,})/commify($1)/ge;

sub commify {
    local $_  = shift;
    1 while s/^([ -+]?\d+)(\d{3})/$1,$2/;
    return $_;
}

私は通常、大きな数の長い出力リストにそれを使用することになり、小数点以下の桁数を数えるのにうんざりします。今見る代わりに

-rw-r--r--   1 alester alester 2244487404 Oct  6 15:38 listdetail.sql

私はそれを実行してls -l | comma見ることができます

-rw-r--r--   1 alester alester 2,244,487,404 Oct  6 15:38 listdetail.sql
于 2008-10-07T03:17:03.670 に答える
4

このスクリプトは私のキャリアを救いました!

かなり数年前、私はクライアントデータベースでリモートで作業していました。貨物を更新してステータスを変更しました。しかし、where句を忘れました。

私が見たときの胃の穴の感覚を決して忘れません(6834列が影響を受けました)。私は基本的に一晩中イベントログを調べ、それらすべての出荷の適切なステータスを把握するのに費やしました。くだらない!

そこで、更新のトランザクションを開始し、コミットする前に影響を受ける行を確認するスクリプト(元々はawkで)を作成しました。これにより、驚きを防ぐことができました。

そのため、このようなスクリプトを実行せずにコマンドラインから更新を行うことはありません。これが(現在Pythonで)です:

import sys
import subprocess as sp
pgm = "isql"
if  len(sys.argv) == 1:
    print "Usage: \nsql sql-string [rows-affected]"
    sys.exit()
sql_str = sys.argv[1].upper()
max_rows_affected = 3
if len(sys.argv) > 2:
    max_rows_affected = int(sys.argv[2])

if sql_str.startswith("UPDATE"):
    sql_str = "BEGIN TRANSACTION\\n" + sql_str
    p1 = sp.Popen([pgm, sql_str],stdout=sp.PIPE,
            shell=True)
    (stdout, stderr) = p1.communicate()
    print  stdout
    # example -> (33 rows affected)
    affected = stdout.splitlines()[-1]
    affected = affected.split()[0].lstrip('(')
    num_affected = int(affected)
    if num_affected > max_rows_affected:
        print "WARNING! ", num_affected,"rows were affected, rolling back..."
        sql_str = "ROLLBACK TRANSACTION"
        ret_code = sp.call([pgm, sql_str], shell=True)
    else:
        sql_str = "COMMIT TRANSACTION"
        ret_code = sp.call([pgm, sql_str], shell=True)
else:
    ret_code = sp.call([pgm, sql_str], shell=True)
于 2008-12-22T16:12:27.923 に答える
2

さまざまな Linux でこのスクリプトを使用して、マシン間 (または CD/DVD へ) のディレクトリ コピーが機能したかどうか、またはコピー (例: ext3 utf8 ファイル名 -> fuseblk) によってファイル名の特殊文字が壊れていないかどうかを確認します。

#!/bin/bash
##  dsum Do checksums recursively over a directory.
##  Typical usage: dsum <directory>  > outfile

export LC_ALL=C  # Optional - use sort order across different locales

if [ $# != 1 ]; then echo "Usage: ${0/*\//} <directory>" 1>&2; exit; fi
cd $1 1>&2 || exit
#findargs=-follow    # Uncomment to follow symbolic links
find . $findargs -type f | sort | xargs -d'\n' cksum
于 2008-10-07T01:46:02.247 に答える
1

SQL クエリ アナライザでファイルを繰り返し開いて実行する代わりに、バッチ ファイルを作成するために必要な構文を見つけ、一度に 100 個を実行できました。ああ、甘い甘い喜び!それ以来、私はこれを使用しています。

isqlw -S servername -d dbname -E -i F:\blah\whatever.sql -o F:\results.txt
于 2008-10-14T15:46:46.667 に答える
1

さまざまなウェブコミックをすべてダウンロードするために定期的に変更する 2 つの Ruby スクリプトがあります。非常に便利です。 注: wget が必要なので、おそらく Linux です。 注 2: 試す前にこれらをお読みください。サイトごとに少し変更する必要があります。

日付ベースのダウンローダー:

#!/usr/bin/ruby -w

Day = 60 * 60 * 24

Fromat = "hjlsdahjsd/comics/st%Y%m%d.gif"

t = Time.local(2005, 2, 5)

MWF = [1,3,5]

until t == Time.local(2007, 7, 9)
  if MWF.include? t.wday
    `wget #{t.strftime(Fromat)}`
    sleep 3
  end

  t += Day
end

または、数値ベースのものを使用できます。

#!/usr/bin/ruby -w

Fromat = "http://fdsafdsa/comics/%08d.gif"
1.upto(986) do |i|
  `wget #{sprintf(Fromat, i)}`
  sleep 1
end
于 2008-10-07T01:45:35.523 に答える
1

申し訳ありませんが、正確なコードが手元にありませんが、VS.Net でソース コードを検索するための正規表現をコーディングして、コメント以外のものを検索できるようにしました。私が取り組んでいた特定のプロジェクトでは、以前のコードが何をしていたのかを確認したい場合に備えて、コードをコメントアウトすることをお勧めします。

于 2008-10-07T00:51:50.500 に答える
0

あなたが実行する小さなアプリがあり、GUID をクリップボードにダンプします。/noui を実行してもしなくてもかまいません。UI では、クリックするたびに新しい GUID をドロップする単一のボタンです。それがなければ、新しいものをドロップしてから終了します。

私は主にVS内から使用します。私はそれを外部アプリとして持っており、ショートカットにマップしています。私は xaml と GUID に大きく依存するアプリを書いているので、常に新しい GUID を XAML に貼り付ける必要があります...

于 2008-10-07T01:26:14.173 に答える
0

勤務時間中、常に自分のデスクトップからさまざまな Linux サーバーに接続しているので、xtermこれらのマシンで を起動し、タイトル、背景色、およびその他の微調整を設定するいくつかのエイリアスを作成しました。

alias  x="xterm"         # local
alias xd="ssh -Xf me@development_host xterm -bg aliceblue -ls -sb -bc -geometry 100x30 -title Development"
alias xp="ssh -Xf me@production_host  xterm -bg thistle1 ..."
于 2008-11-02T10:50:46.103 に答える
0

何年も前に、PERL でカスタム Web アプリケーション プラットフォーム上に一連のアプリケーションを構築しました。優れた機能の 1 つは、SQL クエリ文字列を、結果を説明する人間が読める文に変換することでした。

コードは比較的短いものでしたが、最終的な効果は良好でした。

于 2008-10-07T01:11:19.773 に答える
0

Perl スクリプトをコーディングして、無限ループに陥ることなく、依存関係をマップしました。継承したレガシー C プログラムの場合、ダイヤモンド依存関係の問題もありました。

めったに使用しない電子メール アカウントで、友人から電子メールを受信したときに電子メールを送信する小さなプログラムを作成しました。

ホームIPが変更された場合にテキストメッセージを送信する別の小さなプログラムを作成しました.

いくつか挙げると。

于 2008-10-07T01:03:45.060 に答える
0

Python で巧妙なリスト内包表記や map/reduce を使用するときはいつでも。次のようなものがありました。

if reduce(lambda x, c: locks[x] and c, locknames, True):
    print "Sub-threads terminated!"

私が覚えている理由は、私が自分で思いついたのですが、まったく同じコードを他の人の Web サイトで見たからです。今日では、おそらく次のように行われます。

if all(map(lambda z: locks[z], locknames)):
    print "ya trik"
于 2008-10-07T01:52:14.403 に答える
0

頻繁に接続するサーバーもたくさんありますが、それらはすべてローカルネットワーク上にあります。この Ruby スクリプトは、ssh が開いている任意のマシンのエイリアスを作成するコマンドを出力します。

#!/usr/bin/env ruby

require 'rubygems'
require 'dnssd'

handle = DNSSD.browse('_ssh._tcp') do |reply|
  print "alias #{reply.name}='ssh #{reply.name}.#{reply.domain}';"
end

sleep 1
handle.stop

で次のように使用します.bash_profile

eval `ruby ~/.alias_shares`
于 2008-11-07T02:07:30.057 に答える
0

これは私の COBOL 時代にさかのぼりますが、私は 2 つの一般的な COBOL プログラムを持っていました。それらは、パラメーターやファイルの任意のセットを取り、IMS テスト領域で実行、バッチ、または実行できるプログラムのシェルでした。パラメータに応じて、ファイル、データベース(DB2またはIMS DB)にアクセスしたり、作業用ストレージなどを操作したりできるように設定しました。

切り捨てが発生した理由やデータベースの ABEND が発生した理由を推測したりテストしたりせずに、その日付関数をテストできたので、とても良かったです。プログラムは時がたつにつれてサイズが大きくなり、あらゆる種類のテストが含まれるようになり、開発グループの定番になりました。誰もがコードの場所を知っており、単体テストにも含めました。これらのプログラムは非常に大きくなり (ほとんどのコードはコメントアウトされたテストでした)、それはすべて何年にもわたって人々によって貢献されました。彼らは多くの時間を節約し、多くの意見の相違を解決しました!

于 2008-10-07T00:56:24.483 に答える
0

Windows で標準のコンソール アプリのフレームワークをコード化すると、必要なロジックをほとんどドロップできるため、これらのものが 20 または 30 あります。特定の問題を解決するこれらの小さなものがたくさんあります。 .

私が今よく使っているのは、標準入力を取り、正規表現を色に一致させる xml プロファイルに基づいて出力を色付けするコンソール アプリだと思います。ビルドのログ ファイルを監視するために使用します。もう 1 つはコマンド ライン ランチャーであるため、PATH env var を汚染することはありません。とにかく、win2k などの一部のシステムでは制限を超えてしまいます。

于 2008-10-07T03:49:37.613 に答える