キミは、バッチファイル(*.bat)でREM以外でコメントアウトする方法を知ってるか?
Unix/Linuxのシェルは#の1文字でコメントアウトができるが
バッチファイルは、REMコマンドを使う必要があって3文字も
打たなければならないので、メンドウ。
1文字でコメントアウトすることができないか試してみた。
DOSKEYで#をREMに割り当てる方法
バッチファイル
@echo off doskey /INSERT #=REM $* doskey /macros # echo test echo test2 # echo test3 echo test4 doskey /macros
結果
D:\workspace\batch_SandBox>D:\workspace\batch_SandBox\comment.bat #=REM $* '#' は、内部コマンドまたは外部コマンド、 操作可能なプログラムまたはバッチ ファイルとして認識されていません。 test2 '#' は、内部コマンドまたは外部コマンド、 操作可能なプログラムまたはバッチ ファイルとして認識されていません。 test4 #=REM $* D:\workspace\batch_SandBox># echo test D:\workspace\batch_SandBox>doskey /macros #=REM $* D:\workspace\batch_SandBox>D:\workspace\batch_SandBox\comment.bat #=REM $* '#' は、内部コマンドまたは外部コマンド、 操作可能なプログラムまたはバッチ ファイルとして認識されていません。 test2 '#' は、内部コマンドまたは外部コマンド、 操作可能なプログラムまたはバッチ ファイルとして認識されていません。 test4 #=REM $*
NG!!
コマンドプロンプトのプロセスに対しては、#がREMに割当られてるのだが
バッチファイルの中では実行できないようだ。
:を使う
本来は、「:」はラベルだがそのラベルに対応するGOTO文がなければ
何も実行されないため、意味をなさないラベルになる。
なので、コメントアウトもどきにつかことができそうだ。
バッチファイル
@echo off echo test1 :echo test2 echo test3 :echo test4
結果
D:\workspace\batch_SandBox>D:\workspace\batch_SandBox\comment2.bat test1 test3
OK!!
GOTO文があっても大丈夫
オリジナル
@echo off if {%1}=={} goto USAGE REM set /A count=1 set /A count=1 :FIRST if %count% GTR %1 goto END echo %count% REM 繰り返し実行したい処理 set /A count=%count%+1 goto FIRST :USAGE echo 回数を指定してください :END
:if {%1}=={} goto USAGE :set /A count=1 ::FIRST :if %count% GTR %1 goto END :echo %count% : : :REM 繰り返し実行したい処理 : :set /A count=%count%+1 :goto FIRST : ::USAGE :echo 回数を指定してください : ::END echo comment out
これがあるからWindowsでckwを使うと言っても過言ではない便利なショートカットキー
ckwのCtrl関連のショートカットキーを簡単にまとめます。
他にも何かあったかもしれないけど、主に使っているのはこれだけです。
(Emacs使っている人は、Emacsのショートカットが結構使えるのよ、と覚えておけばおkです)
全部Ctrlキーとの組み合わせ
全て、Ctrlキーを押しながらアルファベットを押すことで動作します。
ちなみに、Ctrlキーは変な場所にあるので、以下のようにレジストリの変更で、
Caps LockキーをCtrlキーとして設定しておくのがオススメです。
1. 以下の内容をcaps_lock_to_control.regに保存
(Windows 2000 Server、Windows 2003 Server、Windows XP、Windows 7で動作している。)
Windows Registry Editor Version 5.00 [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Keyboard Layout] "Scancode Map"=hex:00,00,00,00,00,00,00,00,02,00,00,00,1d,00,3a,00,00,00,00,00
2.ファイルを選択して、右クリックから結合
3.その後再度ログインすればいい。
個人的によく使うもの順に並べていきます。
(以下、Ctrlキーを押しながら何らかのキーを押す操作を C + キー と表記)
C+a、C+e
その行の「行頭」「行末」に移動。”a”はアルファベットの最初の文字だから、
”e”は end の意味だと思う。Ctrl絡みのショートカットは、とにかく
ホームポジションの変更がほとんど必要ないことが重要である。
C+f、C+b
「一文字進む」「一文字戻る」
forward backwardの略(多分)
カーソルキー(矢印)でももちろん操作可能だが、カーソルキーとか遠すぎて
無理という超ナマケモノには必須である。
C+n、C+p
「履歴を進める」「履歴を遡る」(ようするに、矢印の下と上)
next と previous(多分)
カーソルキー(矢印)でももちろん操作可能だが、カーソルキーとか遠すぎて
無理という超ナマケモノには必須である。
C+k、C+y
カーソル位置から行末までをkill(削除)
そして、C+yでkillしたものを貼り付ける。
普通の「Ctrl+C」同じクリップボードを使用するので、C+kで切り取ったもの
意外にも他のアプリでコピーした内容も張り付けられる。
C+a のあと、C+kとかよく使う。
kill&yankの略。
yank は、「 引っ張ること」だから、変数kill-ringから引っ張りだすことに
由来していると思うのだが、killの由来は分からん。
日本人なら kill=切る のダジャレで覚えられるけど。
C+h、C+d
いわゆる「バックスペース」と「デリート」
C+hでカーソルから一文字戻って削除。C+dでカーソルの一文字先を削除。
C+l
clsコマンドと同じ(unixのclear)
テスト前とかにコマンド実行前に画面を綺麗にして、どこから始めたかを確認しやすく
するために使う。
C+t
一文字入れ替える。
abcdefg ↑ カーソルをfに合わせて C+tとするとfとeが入れ替わる abcdfeg
自分は全然使わないっす。気が向いたら試してみてください。
C+o、C+vは使えない。
C+oはEnterと同じだと思うんだけど、C+v(Macで)ってどうな動作するんだ?
かるくまとめ
Windowsだと、ショートカットキーを変更するようなソフトは存在するので、
頑張ればGUIでもこういったショートカットキーの設定は可能だと思います。
ただ、Windowsだとこれが「標準」で使えないところが大きい。
だんだんPCをカスタマイズすることすら大好きになってきました。
Windowsの魅力の一つとして「標準」が全然快適でないこと。
自分色に染め放題、カスタマイズし放題です。
これ個人的に重要なポイントです。
あと、こういうのは一度に全部覚えるとか無理です。
まずは、Ctrl+a , Ctrl+e の2つ。これを覚えておくのが良いのではないかと。
これがあるからMacを使うと言っても過言ではない便利なキーボードショートカット
ほとんどこの記事にインスパイアされた内容であることは秘密である。
バッチファイルでファイルパスからファイル名や拡張子を自由に取り出す方法
ファイルパスからファイル名や拡張子を自由に取り出す
でシェルについて書かれていたのでそのバッチファイル版
説明
%~I - すべての引用句 (") を削除して、I を展開します。 %~fI - %I を完全修飾パス名に展開します。 %~dI - %I をドライブ文字だけに展開します。 %~pI - %I をパス名だけに展開します。 %~nI - %I をファイル名だけに展開します。 %~xI - %I をファイル拡張子だけに展開します。 %~sI - 展開されたパスは短い名前だけを含みます。 %~aI - %I をファイルの属性に展開します。 %~tI - %I ファイルの日付/時刻に展開します。 %~zI - %I ファイルのサイズに展開します。 %~$PATH:I - PATH 環境変数に指定されているディレクトリを 検索し、最初に見つかった完全修飾名に %I を 展開します。 環境変数名が定義されていない場合、または検索 してもファイルが見つからなかった場合は、この 修飾子を指定すると空の文字列に展開されます。 修飾子を組み合わせて、複合結果を得ることもできます: %~dpI - %I をドライブ文字とパスだけに展開します。 %~nxI - %I をファイル名と拡張子だけに展開します。 %~fsI - %I を完全なパスと短い名前だけに展開します。 %~dp$PATH:I - PATH 環境変数に指定されているディレクトリを 検索して %I を探し、最初に見つかったファイル のドライブ文字とパスだけに展開します。 %~ftzaI - %I を DIR コマンドの出力行のように展開します。
ソース
@echo off set TEST1=D:\workspace\batch_SandBox\filename.bat set TEST2="D:\workspace\batch_SandBox\filename.bat" set TEST3=grep.exe echo ■フルパス call :GET_FILENAME %TEST1% echo ■""でくくったファイルパス call :GET_FILENAME %TEST2% echo ■カレントにはなく、環境変数PATHに設定されてるディレクトリにあるコマンド call :GET_FILENAME %TEST3% GOTO :END :GET_FILENAME echo -オリジナル echo %1 echo -すべての引用句 (") を削除して、%変数 を展開します。 echo %~1 echo -%変数 を完全修飾パス名に展開します。 echo %~f1 echo -%変数 をドライブ文字だけに展開します。 echo %~d1 echo -%変数 をパス名だけに展開します。 echo %~p1 echo -%変数 をファイル名だけに展開します。 echo %~n1 echo -%変数 をファイル拡張子だけに展開します。 echo %~x1 echo -展開されたパスは短い名前だけを含みます。 echo %~s1 echo -%変数 をファイルの属性に展開します。 echo %~a1 echo -%変数 ファイルの日付/時刻に展開します。 echo %~t1 echo -%変数 ファイルのサイズに展開します。 echo %~z1 echo -PATH 環境%変数に指定されているディレクトリを echo 検索し、最初に見つかった完全修飾名に %変数 を echo 展開します。 echo 環境%変数名が定義されていない場合、または検索 echo してもファイルが見つからなかった場合は、この echo 修飾子を指定すると空の文字列に展開されます。 echo %~$PATH:1 echo. echo 修飾子を組み合わせて、複合結果を得ることもできます: echo -%変数 をドライブ文字とパスだけに展開します。 echo %~dp1 echo -%変数 をファイル名と拡張子だけに展開します。 echo %~nx1 echo -%変数 を完全なパスと短い名前だけに展開します。 echo %~fs1 echo -PATH 環境%変数に指定されているディレクトリを echo 検索して %変数 を探し、最初に見つかったファイル echo のドライブ文字とパスだけに展開します。 echo %~dp$PATH:1 echo %変数 を DIR コマンドの出力行のように展開します。 echo %~ftza1 echo. echo. echo. goto :EOF :END
結果
[D:\workspace\batch_SandBox]filename.bat ■フルパス -オリジナル D:\workspace\batch_SandBox\filename.bat -すべての引用句 (") を削除して、%変数 を展開します。 D:\workspace\batch_SandBox\filename.bat -%変数 を完全修飾パス名に展開します。 D:\workspace\batch_SandBox\filename.bat -%変数 をドライブ文字だけに展開します。 D: -%変数 をパス名だけに展開します。 \workspace\batch_SandBox\ -%変数 をファイル名だけに展開します。 filename -%変数 をファイル拡張子だけに展開します。 .bat -展開されたパスは短い名前だけを含みます。 D:\WORKSP~1\BATCH_~1\filename.bat -%変数 をファイルの属性に展開します。 --a------ -%変数 ファイルの日付/時刻に展開します。 2010/09/26 09:00 -%変数 ファイルのサイズに展開します。 1936 -PATH 環境%変数に指定されているディレクトリを 検索し、最初に見つかった完全修飾名に %変数 を 展開します。 環境%変数名が定義されていない場合、または検索 してもファイルが見つからなかった場合は、この 修飾子を指定すると空の文字列に展開されます。 D:\workspace\batch_SandBox\filename.bat 修飾子を組み合わせて、複合結果を得ることもできます: -%変数 をドライブ文字とパスだけに展開します。 D:\workspace\batch_SandBox\ -%変数 をファイル名と拡張子だけに展開します。 filename.bat -%変数 を完全なパスと短い名前だけに展開します。 D:\WORKSP~1\BATCH_~1\filename.bat -PATH 環境%変数に指定されているディレクトリを 検索して %変数 を探し、最初に見つかったファイル のドライブ文字とパスだけに展開します。 D:\workspace\batch_SandBox\ %変数 を DIR コマンドの出力行のように展開します。 --a------ 2010/09/26 09:00 1936 D:\workspace\batch_SandBox\filename.bat ■""でくくったファイルパス -オリジナル "D:\workspace\batch_SandBox\filename.bat" -すべての引用句 (") を削除して、%変数 を展開します。 D:\workspace\batch_SandBox\filename.bat -%変数 を完全修飾パス名に展開します。 D:\workspace\batch_SandBox\filename.bat -%変数 をドライブ文字だけに展開します。 D: -%変数 をパス名だけに展開します。 \workspace\batch_SandBox\ -%変数 をファイル名だけに展開します。 filename -%変数 をファイル拡張子だけに展開します。 .bat -展開されたパスは短い名前だけを含みます。 D:\WORKSP~1\BATCH_~1\filename.bat -%変数 をファイルの属性に展開します。 --a------ -%変数 ファイルの日付/時刻に展開します。 2010/09/26 09:00 -%変数 ファイルのサイズに展開します。 1936 -PATH 環境%変数に指定されているディレクトリを 検索し、最初に見つかった完全修飾名に %変数 を 展開します。 環境%変数名が定義されていない場合、または検索 してもファイルが見つからなかった場合は、この 修飾子を指定すると空の文字列に展開されます。 D:\workspace\batch_SandBox\filename.bat 修飾子を組み合わせて、複合結果を得ることもできます: -%変数 をドライブ文字とパスだけに展開します。 D:\workspace\batch_SandBox\ -%変数 をファイル名と拡張子だけに展開します。 filename.bat -%変数 を完全なパスと短い名前だけに展開します。 D:\WORKSP~1\BATCH_~1\filename.bat -PATH 環境%変数に指定されているディレクトリを 検索して %変数 を探し、最初に見つかったファイル のドライブ文字とパスだけに展開します。 D:\workspace\batch_SandBox\ %変数 を DIR コマンドの出力行のように展開します。 --a------ 2010/09/26 09:00 1936 D:\workspace\batch_SandBox\filename.bat ■カレントにはなく、環境変数PATHに設定されてるディレクトリにあるコマンド -オリジナル grep.exe -すべての引用句 (") を削除して、%変数 を展開します。 grep.exe -%変数 を完全修飾パス名に展開します。 D:\workspace\batch_SandBox\grep.exe -%変数 をドライブ文字だけに展開します。 D: -%変数 をパス名だけに展開します。 \workspace\batch_SandBox\ -%変数 をファイル名だけに展開します。 grep -%変数 をファイル拡張子だけに展開します。 .exe -展開されたパスは短い名前だけを含みます。 D:\WORKSP~1\BATCH_~1\grep.exe -%変数 をファイルの属性に展開します。 ECHO は <OFF> です。 -%変数 ファイルの日付/時刻に展開します。 ECHO は <OFF> です。 -%変数 ファイルのサイズに展開します。 ECHO は <OFF> です。 -PATH 環境%変数に指定されているディレクトリを 検索し、最初に見つかった完全修飾名に %変数 を 展開します。 環境%変数名が定義されていない場合、または検索 してもファイルが見つからなかった場合は、この 修飾子を指定すると空の文字列に展開されます。 C:\usr\bin\grep.exe 修飾子を組み合わせて、複合結果を得ることもできます: -%変数 をドライブ文字とパスだけに展開します。 D:\workspace\batch_SandBox\ -%変数 をファイル名と拡張子だけに展開します。 grep.exe -%変数 を完全なパスと短い名前だけに展開します。 D:\WORKSP~1\BATCH_~1\grep.exe -PATH 環境%変数に指定されているディレクトリを 検索して %変数 を探し、最初に見つかったファイル のドライブ文字とパスだけに展開します。 C:\usr\bin\ %変数 を DIR コマンドの出力行のように展開します。 D:\workspace\batch_SandBox\grep.exe
grep.exeは、カレントディレクトリに存在せず、「C:\usr\bin」に存在する。
「grep.exe」と記載して変換しようとする場合は、%~$PATH:I、%~dp$PATH:Iのように
$PATHを指定しないならない。
$PATHを指定しないと「.\grep.exe」として誤認してしまう。
この展開方法って「for /?」 にそのまま書いてあるんだけどね。(^ ^;)
conってなに?
はてなのカテゴリーはなんでソートして表示してくれないのか?で秀丸から以下のプログラムの実行をした
sort <con >con
「con」ってなにかというと、Windows(MS-DOS時代)からの予約デバイスで
コンソール、すなわち現在入出力を行っている画面・キーボードを表す。
標準出力、標準エラー出力を捨てるための 「nul」と同類。
wikipedia 予約デバイス con
CONCON問題かぁー。懐かしいな。
そんな20世紀の遺物の話なんてどうでもいいよと思うかもしれないが、未だにWindowsは引きずっている。
今のWindowsでも、「con」というフォルダは作成できない。
Windows XPの場合
エクスプローラーから作成しようとするとconという名前を付けても「新しいフォルダ」のまま変わらない。
コマンドプロンプトだと、以下のエラーになる。
D:\temp>mkdir con
ディレクトリ名が無効です。
Windows 7の場合
エクスプローラーから作成しようとすると以下のエラーになり、原因が分かるようになった。
指定されたデバイス名は無効です。
コマンドプロンプトの結果はWindows XPと同じ。
例えば、ユーザーがフォルダのパスを指定して、そのフォルダがなかったら作成するプログラムが
あったとする。
ユーザーが、「com」と間違えて「con」と入力してしまった場合に、エラー判定が抜けていると
予期せぬエラー、システムエラーになったりしてしまう。
#include "stdlib.h" #include "stdio.h" #include "windows.h" int main(int argc, char* argv[]){ if(CreateDirectory("C:\\con_",NULL)){ printf("ディレクトリ作成成功\n"); }else{ printf("ディレクトリ作成失敗(errno=%d)\n",GetLastError()); return 1; } if(CreateDirectory("C:\\con",NULL)){ printf("ディレクトリ作成成功\n"); }else{ printf("ディレクトリ作成失敗(errno=%d)\n",GetLastError()); return 1; } return 0; }
結果は以下で、エラーとなる。
D:\workspace\C_SandBox\02Windows\mkdir_con\Debug>mkdir_con.exe ディレクトリ作成成功 ディレクトリ作成失敗(errno=267)
case文でエラー値で267を判定していないと、
defaultルートに倒れて、システムエラーとなってしまうパターンだ。
ちなみに、エラー値267は「ディレクトリ名が無効です。」である。
バッチファイルのエスケープ文字は^だ!!
バッチファイルで長い1行の処理を改行を入れて複数行に分けて書きたいで分割して書くために^のことを書いた。
エスケープ文字の用途は他にもある。
例えば「|」パイプをエスケープしたい場合。
どういうときにパイプをエスケープしたいかというとFOR文でコマンドを実行してその結果を解析したい場合だ。
しょせんは、もどきです。でも書いてる内容だが、
該当のクラスがどのjarファイルの中に入ってるを検索する処理の時にはdirとfindstrを組み合わせる。
この時にエスケープが必要となるのだ。
@echo off set FIND_STR=%1 FOR /F "eol=; delims=," %%i in ('dir /s/b/a-d^|findstr jar$') DO CALL :GREP_CLASS="%%i" GOTO :EOF :GREP_CLASS REM jar only REM jar -tvf %1 |findstr %FIND_STR% >nul 2>&1 REM jar and class name jar -tvf %1 |findstr %FIND_STR% 2>nul IF {%ERRORLEVEL%}=={0} echo %1 GOTO :EOF
3行目のFOR文のコマンド部分でサブディレクトリからjarを探すのにパイプを使っていて、
そのパイプの前でエスケープしている。
エスケープしないとそこで処理の切れ目になってしまう。
そのため「^」でエスケープする必要がある。
バッチファイルで長い1行の処理を改行を入れて複数行に分けて書きたい
バッチファイルで1行の処理が長〜いと読みにくいので、複数の行に分けて書きたいこともある。
C言語におけるマクロでの「\」やVBの「_」と同じようなことをしたい。
バッチファイルで1行が長〜い処理というのもあまりないかもしないが、Javaでオプションやら
クラスパスやら設定すると非常に長くなる。
以下のgroovyの起動バッチのように環境変数に追加していき、最後で実行するのが一般的だろう。
set JAVA_OPTS=%JAVA_OPTS% -Dgroovy.starter.conf="%STARTER_CONF%" set JAVA_OPTS=%JAVA_OPTS% -Dscript.name="%GROOVY_SCRIPT_NAME%" if exist "%USERPROFILE%/.groovy/postinit.bat" call "%USERPROFILE%/.groovy/postinit.bat" @rem Execute Groovy "%JAVA_EXE%" %JAVA_OPTS% -classpath "%STARTER_CLASSPATH%" %STARTER_MAIN_CLASS% --main %CLASS% --conf "%STARTER_CONF%" --classpath "%CP%" %CMD_LINE_ARGS%
もし、これを1行で書くとすると以下のように非常に長くなる。
"C:\usr\opt\java\jdk1.6.0_12\bin\java.exe" -Xmx128m -Dprogram.name="" -Dgroovy.home="C:\usr\opt\groovy" -Dtools.jar="C:\usr\opt\java\jdk1.6.0_12\lib\tools.jar" -Dgroovy.starter.conf="C:\usr\opt\groovy\conf\groovy-starter.conf" -Dscript.name="" -classpath "C:\usr\opt\groovy\lib\groovy-1.6.5.jar" org.codehaus.groovy.tools.GroovyStarter --main org.codehaus.groovy.tools.shell.Main --conf "C:\usr\opt\groovy\conf\groovy-starter.conf" --classpath ".;C:\usr\opt\java\jre6\lib\ext\QTJava.zip;."
これを改行を入れて複数の行に分けるには「^」を最後に付ける。
"C:\usr\opt\java\jdk1.6.0_12\bin\java.exe" ^ -Xmx128m ^ -Dprogram.name="" ^ -Dgroovy.home="C:\usr\opt\groovy" ^ -Dtools.jar="C:\usr\opt\java\jdk1.6.0_12\lib\tools.jar" ^ -Dgroovy.starter.conf="C:\usr\opt\groovy\conf\groovy-starter.conf" ^ -Dscript.name="" ^ -classpath "C:\usr\opt\groovy\lib\groovy-1.6.5.jar" ^ org.codehaus.groovy.tools.GroovyStarter ^ --main org.codehaus.groovy.tools.shell.Main ^ --conf "C:\usr\opt\groovy\conf\groovy-starter.conf" ^ --classpath ".;C:\usr\opt\java\jre6\lib\ext\QTJava.zip;."
なぜかと言うと、バッチファイルでのエスケープ文字は「^」だから。
しかし、「^」 なんてなかなか試さんし、思いつかんよ。
コマンドのヘルプやコマンドリファレンスにも載ってなさそうだ。
知ってる人にでも教えてもらわないとなかなかたどり着けなさそう。
こんな方法があったのか! Windows用GNUコマンド群 「GNU utilities for Win32」
MOONGIFTでWindows用のGNUのコマンド群が紹介されていた。
シンプルなWindows用Linuxコマンド集「Gow」
No Command, No Life.
でも僕はCygwinは好きではない。
Gowは知らなかったので、僕が使ってるのは、GNU utilities for Win32というもの。
zip形式での配布なので、インストーラもないので、PATHも設定しないし、Command Prompt Hereに
追加なんて気の利いたものもない。
コマンドはGNUのコマンドが揃えられるが、コマンドプロンプト自体が不便。
GNU utilities for Win32にはbin\sh.exeが入ってるが、文字化けしたりする。
なので、♪UnixのようでUnixでない DOSのようでDOSでないで
書いているckwとnyacusを使うのがオススメ。
(Command Prompt Hereなんてレジストリにちょろちょろっと書けばいいわけだし。)
ただ、Gowと違ってGNU utilities for Win32の方は更新が止まっててコマンドの
バージョンが古いかも。
GNU utilities for Win32の入ってるこコマンドは以下の119個
- 構成
UnxUtils ├─bin └─usr └─local ├─include ├─lib ├─share └─wbin
- bin
sh.exe
- usr\local\wbin
agrep.exe ansi2knr.exe basename.exe bc.exe bison.exe bunzip2.exe bzip2.exe bzip2recover.exe cat.exe chgrp.exe chmod.exe chown.exe cksum.exe cmp.exe comm.exe compress.exe cp.exe csplit.exe cut.exe date.exe dc.exe dd.exe df.exe diff.exe diff3.exe dircolors.exe dirname.exe du.exe echo.exe egrep.exe env.exe expand.exe expr.exe factor.exe fgrep.exe find.exe flex.exe fmt.exe fold.exe fsplit.exe gawk.exe gclip.exe gplay.exe grep.exe gsar.exe gunzip.exe gzip.exe head.exe id.exe indent.exe install.exe join.exe jwhois.exe less.exe lesskey.exe ln.exe logname.exe ls.exe m4.exe make.exe makedepend.exe makemsg.exe man.exe md5sum.exe mkdir.exe mkfifo.exe mknod.exe mv.exe mvdir.exe nl.exe od.exe paste.exe patch.exe pathchk.exe pclip.exe pr.exe printenv.exe printf.exe pwd.exe recode.exe rm.exe rman.exe rmdir.exe sdiff.exe sed.exe seq.exe shar.exe sleep.exe sort.exe split.exe stego.exe su.exe sum.exe sync.exe tac.exe tail.exe tar.exe tee.exe test.exe touch.exe tr.exe type.exe uname.exe unexpand.exe uniq.exe unrar.exe unshar.exe unzip.exe uudecode.exe uuencode.exe wc.exe wget.exe which.exe whoami.exe xargs.exe yes.exe zcat.exe zip.exe
Happy Command Life