Powershellでファイル名を一括変更するコマンド
意外なところでエンジニアやってたことが役に多々ので背景込みでメモ。
背景
嫁の実家に帰った際に、義母から以下のヘルプをもらった。
カーオーディオで音楽が聴けない!
調べたら以下の2点がわかった。
上記より以下の目標
.3gpファイルを.mp3に変換する
調査結果
やりたいこと
.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で渡す必要がある
参考
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_CTYPE
をssh接続先に送信しないようにする。
その他
以下サイトに仕組み及び複数の対処法が示されている。 上記対処法ができない場合こちらを参考にするといいかも。 Mac から Ubuntu に ssh ログインするとなんかロケール云々で怒られるやつ
ansible.cfgを設定しコマンドをシンプルに
ansibleを色々試しているとオプションを毎回入力することが手間になったり、オプションを明示しないことでつまずくことがある。 ansible.cfgを設定すればコマンドをスッキリかつミスを防ぐことができる。
例
$ 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を探す。
- カレントディレクトリ
- 環境変数の ANSIBLE_CONFIG or ~/ansible.cfg
- /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
手順
結果
$ 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
vagrantを壊して作って繰り返しているとknown_hostsに設定が残っていてはじかれてしまう。(参考:vagrant再作成するとSSH繋がらなくなったときの対処)
- 対処法:
ssh-keygen -R 192.168.33.11
- 対処法:
その他
- windows環境では諸々大変らしい。必要に迫られたらこちらを参考にしてやってみよう。。。
- ansible-playbookの実行がとても遅い。なぜだろう?