Archive for the ‘Tips’ Category

terminal

送信

-P #portNumber

scp -Pxxx filename name@hostname :~/

ポート番号指定のオプションは小文字でなく大文字の-Pである。

コロン以下に転送先ホストのディレクトリを指定できる。

例ではfilenameをリモートサーバーのホームディレクトリに転送している。

受信の場合

scp -Pxxx name@hostname:/home/name/Desktop/hoge.txt ./

例ではリモートサーバー側デスクトップのhoge.txtをローカルサーバーのカレントディレクトリに送っている。

また、ファイルだけでなくディレクトリごと送受信するには、オプション -r を足してディレクトリ名を指定する。

terminal

たとえばあるディレクトリの中に

text1.txt,text2.txt,text3.text,,,text30.txt

と30のファイルがあったとして、それらのファイルの全ての末尾に”hogehoge”と書き込みたい場合。

わたしはこう書きました

find ./ -type f | xargs -I@ echo "hogehoge" >> @

できたかなーと、ファイルの中をみてみると空でした。

かわりに、@というファイルが増えており、その中に30行のhogehogeが追記されていました。

なんじゃこりゃということで、Linuxマスターに尋ねてみると、どうやら |(パイプ)や >>(追記リダイレクト)の記号はそれの以前と以後でコマンドの影響範囲が異なるという事なんですね。

| xargs -I@ echo "hogehoge" >> @

は正しく認識されておらず、>>を介してしまったために@の置換が上手くいっていなかったということです。

ということで、上でやろうとしたことを正しく実行させるにはこうした方がよさそうです。

for n in $(find ./ -type f); do echo "hogehoge" > $n; done

findをコマンド置換によってforに投げて、1ファイル適宜hogehogeを追記するわけですね〜。

シェルスクリプトをわざわざ書くまでもなく、すっきりしました。

terminal

先日、複数ファイルのファイル名の中にある2箇所の文字列を消したいなあと思い、いきついた方法。

たとえば、
hoge123fuga-ed.txt
という名前のファイルがあるとする。
このファイルは123から200まで連番であったと。

こいつを
123fuga.txtから
200fuga.txt
に変換したい。

そうした場合以下の方法が有効であった。

find ./* -type f | sed 'p;s/hoge//g;s/-ed//g' | xargs -n2 mv

findでカレントディレクトリ以下のファイルを全てリストアップする。

リストアップされたファイル名をsedをつかって編集する。

‘p;s/hoge//g;s/-ed//g’の意味は以下の通り

p;
によって元のファイル名が出力される事になる。
次に
s/hoge//g;
でファイル名の中のhogeを全て空白に変換している

そしてもういちど

s/-ed//g;

によってファイル名の中のすべての-edを空白に変換。

ここまでで実行すると

という結果がコンソールに表示される。

これらをパイプを介して

xargs -n2

する事によって

という形に整形できる。

あとは最後の

mv

によって全てのの元のファイル名が変更されたファイル名に変更される。

|xargs -n2 mv

って使い方初めて見ました。

リファレンスはこちら。
xargs コマンド | コマンドの使い方(Linux) | hydroculのメモ

不思議な感じでちょっと覚えにくいですが、こういう使い方ができるし、動きますっていう事で。