【Linuxコマンド】FTPでディレクトリごと一括転送

「ncftp」コマンドの使用方法です。

ダウンロード

公式サイト からダウンロード可能。

ncftp_ダウンロードリンク
source codeリンクを右クリックして「名前を付けてリンク先を保存」を押下。

コマンド上からダウンロードするのであれば以下の通り。バージョンは任意のものでOK。

$ wget ftp://ftp.ncftp.com/ncftp/ncftp-3.2.6-src.tar.gz


解凍

$ tar -xzvf ncftp-3.2.6-src.tar.gz

オプションについては 以前の記事 を参照。 解凍後のディレクトリ構成は以下の通り。

ncftp_ディレクトリ構成

インストール

$ ./configure
$ make
$ make install

解凍して得られたディレクトリ内で実行すること。本件のケースで言えば「ncftp-3.2.6」の中。

実行

$ ncftpput -u testuser -p XXXXXX -P 21 -d ./ncftp.log -vmR www.test.com test_dir org_dir

-u:ユーザ名
-p:パスワード
-P:ポート番号
-d:実行ログファイル
-v:進捗状況(プログレスバー)の表示
-m:転送先にディレクトリを作成
-R:ディレクトリツリーを再帰的にアップロード
www.test.com:接続先
test_dir:転送先ディレクト
org_dir:転送元ディレクト

余談

以前、アパレル関係の仕事で、多方向から撮影された衣服の画像を大量に転送する必要があり、その際にこのコマンドを使用しました。尚、その当時はただ転送するだけではなく、

PHPImageMagickを使用して画像を分割する。

分割した画像を転送する。

転送先で画像を結合する。(元に戻す)

という事をしていたことも、記事を書いていて思い出しました。
ただ何が原因でこのような対応を行ったのかすっかり失念。。
転送する画像が増えるので転送時間が原因では無さそうですが。
もしお悩みの方がいらっしゃれば解決の一助にでもなれば幸いです。

【Linuxコマンド】とりあえずgzip圧縮・解凍する

いい加減なタイトルです。
記事内容もとてもシンプルです。

圧縮

$ tar -zcf アーカイブのファイル名 アーカイブの対象


解凍

$ tar -xzvf アーカイブのファイル名


オプション

z:圧縮・解凍に gzip を使う
c:アーカイブの作成(圧縮)
f:アーカイブの対象を指定
x:アーカイブの抽出(解凍)
v:作成・抽出時にファイルのリストを画面出力する

【Linux】ホスト名の変更

Linux環境でホスト名を変更したい場合の手順になります。

1. 設定ファイルの修正

$ vi /etc/sysconfig/network

上記で設定ファイルを開き、以下の設定項目を修正。

HOSTNAME=abc.temp.com
    ↓
HOSTNAME=def.temp.com


2. 以下のファイルも確認・修正

$ vi /etc/hosts

「hosts」はホスト名とIPアドレスを対応付けしているファイル。ホスト名を変更する場合はこちらの記述も修正する必要がある。

3. OSの再起動

$ shutdown -r now


4. OS再起動後にホスト名を表示し、変更されていることを確認。

$ hostname


補足

ホスト名変更の影響は大きく、最悪はサービス提供不可に陥るケースも想定されます。
本手順で紹介したファイルの修正の他にも影響を受けるものが無いか、入念に調査・検証を行う事を強く推奨致します。
こちらの記事 ではfindコマンドを使用したgrepの例を紹介しておりますので、こちらを応用して虱潰しに調査をされるのも良いかもしれません。
また、grep結果をテキストファイル等に保存しておけば、ご自身の作業エビデンスにもなるかと思います。

【Linuxコマンド】コマンドAの後にコマンドB

表題の処理を実行するにはいくつかのパターンがあります。


コマンドAの結果に対して、コマンドBを実行する

A|B
$ ls -al | grep abc

上記の場合、現在ディレクトリの一覧から文字列「abc」を含むもののみを表示。

標準入力から受け取ったものを対象にして、他のコマンドを起動する

xargs
$ find / -name "*.log" | xargs grep "Exception"

上記の場合、すべての*.logファイルの内容をgrepコマンドで照合、「Exception」が含まれた行を出力。

拡張子が"txt"であるファイルについて、文字列"Linux"を探す

$ find . -type f -name "*.txt" | xargs grep "Linux" 


1つ目のコマンドが正常終了した場合に2つ目のコマンドを実行

$ 1つ目のコマンド && 2つ目のコマンド


cronの使い方

「cron」はLinux環境で定期的な処理を行う機能です。
Windows環境で言うところのタスクスケジューラのイメージです。


はじめに

  • パスは環境により異なる可能性がある為、利用している環境に合わせて読みかえること。
  • ログ等を開く時に cat を使っているが cat 以外(viなど)でも問題ない。使いやすいものを使えばOK。

設定状態表示

$ crontab -l


設定の編集

$ crontab -e

▼注意
オプションを「-r」にすると「設定の削除」になる。
キーボード上、「E」と「R」は隣同士であるため、押し間違いに注意すること。


設定の削除

$ crontab -r


cronの再起動

$ /etc/init.d/crond restart


エラーログ

$ cat /var/log/cron


ユーザー別の設定

$ cat /var/spool/cron/ユーザ名


設定

00 * * * * /root/sample.bat

▼解説
上記は「毎時00分に /root/sample.bat を実行」という意味になる。
実行タイミングは左から「分」「時」「日」「月」「曜日」で指定できる。

曜日
00~59 00~23 1~31 1~12 0~7(0と7は日曜日)

▼例

設定例 設定内容
01 18 * * * 毎日18:01に実行
50 08 * * * 毎日8:50に実行
0,30 18 * * * 毎日18:00と18:30に実行
0-30 18 * * * 毎日18:00~18:30までの間、1分毎に実行
15 9 1 * * 毎月1日の9:15に実行
0 13 * * 1 毎週月曜日の13:00に実行
0 13 * * 1,3,5 毎週月、水、金曜日の13:00に実行
0 13 * * 3-5 水曜日~金曜日の13:00に実行
*/10 * * * * 10分毎に実行
0 */2 * * * 毎時0分に2時間おきに実行

【VBA】一つのExcelファイル内の複数シートから任意の値を取得して一つのCSVに集約する

関連記事も合わせてご覧ください。
【VBA】Excelマクロの基本的な使い方
【VBA】列番号をアルファベットに変換する

サンプルコード

Sub main()

    Dim exApp As Object
    Dim exWkb As Object
    Dim wsCurrent As Object
    Dim sAddress As String
    Dim sName As String
    Dim sTel As String

    ' Excel起動
    Set exApp = CreateObject("Excel.Application")
    
    ' CSVファイル作成
    Open "sample.csv" For Output As #1
    
    ' CSVファイルにヘッダーを出力
    Print #1, "住所, 氏名, 電話番号"
    
    Set exWkb = exApp.Workbooks.Open(Filename:="sample.xlsx", ReadOnly:=True)

    ' シートの数だけ処理を繰り返す
    For i = 1 To exWkb.Worksheets.Count

        ' i番目のシートを処理対象とする
        Set wsCurrent = exWkb.Worksheets(i)

        ' 指定セルからテキストを取得
        sAddress = wsCurrent.Range("A1").Text
        sName = wsCurrent.Range("B1").Text
        sTel = wsCurrent.Range("C1").Text
        
        ' CSVファイルに書き込み
        Print #1, sAddress; ","; sName; ","; sTel;

    Next

    ' Excelを閉じる
    exWkb.Close
    
    ' Excel終了
    exApp.Quit
    
    ' CSVファイルを閉じる
    Close #1

End Sub


補足

「特定のシートだけ処理したい or 処理したくない」といった場合にはシート名などで処理分岐が可能。例として以下の通り。

' シート名が「backup」の場合は処理対象外とする
If (wsCurrent.Name <> "backup") Then
    ~~~~~~~~~~
End If

【VBA】列番号をアルファベットに変換する

サンプルコード
Function convColNumToAlpha(ByVal ColNum As Integer) As String

    Dim iConv1 As Integer
    Dim iConv2 As Integer
    
    iConv1 = Int((ColNum - 1) / 26)
    iConv2 = ColNum - (iConv1 * 26)
    
    If iConv1 > 0 Then
        convColNumToAlpha = Chr(iConv1 + 64)
    End If
    
    If iConv2 > 0 Then
        convColNumToAlpha = convColNumToAlpha & Chr(iConv2 + 64)
    End If

End Function


引数

変換したい列番号をint型で渡す。
尚、列番号とは以下のようにして取得できる。

Range("A1").Column
Range("E1").Column

上記の場合、A列なら1, E列なら5が得られる。

処理解説

仮に列番号「28」が渡されたとする。

  1. (28 - 1) / 26 の結果 1 が iConv1 に格納される。
  2. 28 - (1 * 26) の結果 2 が iConv2 に格納される。
  3. iConv1 > 0 が成り立つ。Chr(1 + 64) → Chr(65) → A が convColNumToAlpha に格納される。
  4. iConv2 > 0 が成り立つ。Chr(2 + 64) → Chr(66) → B となり、convColNumToAlpha に文字列結合され「AB」となる。
  5. 戻り値は「AB」

補足

Chr関数は引数に文字コードを指定すると、それに対応した値を返す。