aboutnagaishiの日記

テレコム屋さん出身で、現在はweb企業の社内インフラやっています。インフラ周りを中心に業務の備忘録として使用します。

Powershellでファイル名を一括変更するコマンド

意外なところでエンジニアやってたことが役に多々ので背景込みでメモ。

背景

嫁の実家に帰った際に、義母から以下のヘルプをもらった。

カーオーディオで音楽が聴けない!

調べたら以下の2点がわかった。

  • ソニーの音楽アプリでCDを取り込んでおり、エンコードが.3gpでやってた(なんでや!)
  • カーオーディオは.3gp非対応

上記より以下の目標

.3gpファイルを.mp3に変換する

調査結果

  • .3gpから直接.mp3に変更する方法がみつからない。

  • .m4aから.mp3に変更するのはitunesでできる。

  • .3pgを.m4aに変更するのは拡張子を変更するだけでできる。

やりたいこと

.3gpを.m4aに一括リネーム

なぜpowershell?

  • 嫁の実家のPC上での操作のため、出来るだけデフォルトのアプリでなんとかしたい。(cygwin入れるのめんどくさい)
  • コマンドプロンプトよりはPowershellの方が扱いやすそう

コマンド

Get-ChildItem -include  *.3gp -r | Rename-Item -NewName { $_.Name -replace '\.3gpp$','.m4a'}
  • Get-ChildItem: ファイル一覧を表示
  • -include <対象ファイル名>:対象ファイルのみを表示
  • -r: サブフォルダ内も検索

以下参考サイトから説明を抜粋

対象となるファイル名の一覧が得られたら「Rename-Item -NewName <新ファイル名>」というコマンドを繰り返し実行させる(変更対象のファイル名はパイプ経由で渡される)。この例では<新ファイル名>として「{ $.Name -replace '旧文字列','新文字列' }」という「(PowerShellの)スクリプトブロック」を渡している。このブロック中では、パイプ経由で渡されたファイル名($.Name)に対して、-replaceでファイル名中の文字列の一部を置換している。コマンドプロンプトのrenコマンドと違って、PowerShellのRename-Itemコマンドレットでは新ファイル名中にワイルドカードを含めることはできず、このように必ず完全なファイル名を-NewNameで渡す必要がある

参考

Windows TIPS:Windows PowerShellを使って複雑なパターンのファイル名変更を行う - @IT

ssh接続時とperlコマンドの際にlocaleでwarningがでる時の対処法

仮想マシンssh接続する際及びperl実行時にwarningがでた。 以下サイトを参考にして解決。 Failed to set locale, defaulting to C

warining内容

$ vagrant ssh
Last login: Mon Dec 29 02:40:06 2014 from 10.0.2.2
-bash: warning: setlocale: LC_CTYPE: cannot change locale (ja_JP.UTF-8): No such file or directory
-bash: warning: setlocale: LC_COLLATE: cannot change locale (ja_JP.UTF-8): No such file or directory
-bash: warning: setlocale: LC_MESSAGES: cannot change locale (ja_JP.UTF-8): No such file or directory
-bash: warning: setlocale: LC_NUMERIC: cannot change locale (ja_JP.UTF-8): No such file or directory
-bash: warning: setlocale: LC_TIME: cannot change locale (ja_JP.UTF-8): No such file or directory
$ perl -version
perl: warning: Setting locale failed.
perl: warning: Please check that your locale settings:
LANGUAGE = (unset),
LC_ALL = (unset),
LANG = "ja_JP.UTF-8"
    are supported and installed on your system.
perl: warning: Falling back to the standard locale ("C").

対処法

/etc/ssh_configのSendEnv LANG LC_*行をコメントアウト

LC_CTYPEssh接続先に送信しないようにする。

その他

以下サイトに仕組み及び複数の対処法が示されている。 上記対処法ができない場合こちらを参考にするといいかも。 Mac から Ubuntu に ssh ログインするとなんかロケール云々で怒られるやつ

ansible.cfgを設定しコマンドをシンプルに

ansibleを色々試しているとオプションを毎回入力することが手間になったり、オプションを明示しないことでつまずくことがある。 ansible.cfgを設定すればコマンドをスッキリかつミスを防ぐことができる。

ローカルマシンから仮想マシンpingが通らない。

$ ansible -m ping -i hosts 192.168.33.12 -u vagrant
192.168.33.12 | FAILED => SSH encountered an unknown error during the connection. We recommend you re-run the command using -vvvv, which will enable SSH debugging output to help diagnose the issue

オプションにプライベートキーを明示したら解決した。

$ ansible -m ping -i hosts 192.168.33.12 -u vagrant --private-key /Users/NAGAISHI/.vagrant.d/insecure_private_key
192.168.33.12 | success >> {
    "changed": false, 
    "ping": "pong"
}

ansible.cfgの設定

毎度ansibleを実行する際にオプションをしてするのは大変。 ansible.cfgにあらかじめオプションを記載しておけば指定する必要がない。 ansible tutorialによれば以下の順番でansible.cfgを探す。

  1. カレントディレクトリ
  2. 環境変数の ANSIBLE_CONFIG or ~/ansible.cfg
  3. /etc/ansible/ansible.cfg

引用元: ansible tutorial

ansible.cfg

[defaults]
hostfile = ./hosts
remote_user = vagrant
private_key_file=/Users/NAGAISHI/.vagrant.d/insecure_private_key

hosts

[default]
192.168.33.11

ansible.cfgを設定した後、例のコマンドは以下のようにスッキリした。 (ansible.cfgはカレントディレクトリに格納)

$ ansible all -m ping
192.168.33.12 | success >> {
    "changed": false, 
    "ping": "pong"
}

vagrantで仮想環境立ち上げからansible実行まで

vagrantで仮想環境立ち上げからansible実行まで

仮想環境でさくっと試したいこととかあるときにansibleが便利だと聞いたので、とりあえず使ってみました。

ファイル

Vagrantfile

VAGRANTFILE_API_VERSION = "2"

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
  config.vm.box = "centOS65Box"
  config.vm.network "forwarded_port", guest: 3000, host: 3000
  config.vm.network "private_network", ip: "192.168.33.11"
  config.vm.synced_folder "/host_data", "/home" # ローカルマシンと仮想環境のフォルダーをlinkさせる。
end

provision_vagrant.yml

---
 - hosts: all
   user: vagrant
   sudo: yes
   tasks: 
   - name: インストール
     yum: name={{ item }} state=installed
     with_items:
             - vim 
             - git

ansible.cfg

[defaults]
hostfile = ./hosts
remote_user = vagrant
private_key_file=/Users/hoge/.vagrant.d/insecure_private_key

手順

  1. vagrantを立ち上げる
  2. ansibleを実行
    • vagrant fileに記述することでまとめて実行できるらしいが、今回は1つずつ

結果

$ vagrant up
Bringing machine 'default' up with 'virtualbox' provider...
==> default: Importing base box 'centOS65Box'...
==> default: Matching MAC address for NAT networking...
==> default: Setting the name of the VM: ruby-lesson_default_1423653776406_98290
==> default: Clearing any previously set network interfaces...
==> default: Preparing network interfaces based on configuration...
    default: Adapter 1: nat
    default: Adapter 2: hostonly
==> default: Forwarding ports...
    default: 3000 => 3000 (adapter 1)
    default: 22 => 2222 (adapter 1)
==> default: Booting VM...
==> default: Waiting for machine to boot. This may take a few minutes...
    default: SSH address: 127.0.0.1:2222
    default: SSH username: vagrant
    default: SSH auth method: private key
==> default: Machine booted and ready!
==> default: Checking for guest additions in VM...
==> default: Configuring and enabling network interfaces...
==> default: Mounting shared folders...
    default: /vagrant => /ruby-lesson
    default: /home => /ruby-lesson/host_data
$ ansible-playbook provision_vagrant.yml

PLAY [all] ******************************************************************** 

GATHERING FACTS *************************************************************** 
ok: [192.168.33.11]

TASK: [インストール] ************************************************* 
changed: [192.168.33.11] => (item=vim,git)

PLAY RECAP ******************************************************************** 
192.168.33.11              : ok=2    changed=1    unreachable=0    failed=0  

tips

その他