先日、Twitter眺めてたらそんな感じの処理について見かけたので、楽に実現する方法について考えてみる。

1. tarでディレクトリだけを固める

別々のホスト間で処理する場合、tarでディレクトリだけを固めてしまい、コピー先でそれを展開するという方法が楽そうだ。

cd SourceDir;find ./ -type d -print0 | xargs -0 tar czvf dir.tar.gz --no-recursion # dir.tar.gzにディレクトリだけ固める
cd TargetDir;tar xzvf dir.tar.gz # コピー先にtar.gzを持っていって展...

Twitter見てた時、そういう処理の仕方についてわからないというのを見かけたので、一応何かの時のために残しておくことにする。 通常、LinuxやMacに入ってるmvやcpでは、コピー先のディレクトリが無かったら作成するような機能はないので、ひと手間必要になる。

1. findからxargsを使ってコピー、移動させる場合

findからxargsに対象のファイルPATHを渡して、それをcp、mvを使ってコピーや移動をさせる場合。 この場合、コピー時にディレクトリが無いとエラーになってしまうので、一度mkdirで(フォルダがない場合に)生成させる必要がある。 以下、サンプルコード(mvの場...


Twitterでそういった処理について見かけたので、念のため備忘として残しておく事にする。 findコマンドではnotで指定条件以外を出力できるのだが、対象ディレクトリ配下に指定したファイル名以外のものが入っているとヒットしてしまうのでそれでは対応できない。

なので、一度その指定したファイル名のあるディレクトリのみを取得し、その後findで得た全体のディレクトリ名を突合させてやるという方法で抽出ができる。

find ./ -type d | grep -v -f <(find ./ -type f -name "*filename" -printf "%h\n")
find ./ -t...

Twitterでそんな感じの処理について見かけたので、あとで引っ張ってこれるように残しておく。 といっても大したことはせず、普通にfindコマンドでexecするときにrenameすればいいだけだ。 このとき、ファイル名にシングルクォートがあったとしてもリネームができるよう、findで得たファイル名をダブルクォーテーションで囲ってやればいい。

find ./ 条件 -exec rename 置換前文字列 置換後文字列 "{}" \;

LinuxやUNIXで、コンソール上でフルパスからファイル名のみを抽出する場合、以下のような方法がある。

1. basenameコマンドを用いる

基本はこれ。 basenameという、ファイル名のみ(ディレクトリを指定したら最後)を求めるコマンドがあるので、これを利用する。

パイプで渡す場合はxargsを使う必要があるので注意。

basename PATH
[root@BS-PUB-CENT7-02 ~]# ls -1ad /opt/td-agent/*
/opt/td-agent/LICENSE
/opt/td-agent/LICENSES
/opt/td-agent/b...

複数人で触ってて、中身がだいぶカオスになっててどこに何があるのかわからないサーバがある。 その整理をする際、特定のファイル(スクリプトファイルやソースコード、証明書など)に関してどこかに退避させたいこともある。 しかし、スクリプトファイルも「拡張子が無いと正常に動作しないわけでないから付けない(拡張子が何も付与されていない)」という人もいるし、公開鍵はまだしも秘密鍵ファイルなんかは拡張子がないので、-nameで拡張子指定してfindコマンドで一気にPATHを取得するといったことができない。

では、1個1個catなどで中身を見ていかなくてはいけないのか…?というとそんな苦行はしなくてもいい。...


LinuxやMac OS Xを使っていると、findコマンドで取得したファイルをすべてアーカイブ化したり圧縮したりしたいことがある。
そんなときは、以下のようにすればよい。

1.tarでアーカイブ化する

GNU拡張のfindコマンドを使う場合

GNU拡張のfindコマンドを使っている場合、-execでtarコマンドを呼び出してやればよい。
ただ、ここでできるのはあくまでもアーカイブ化(一つのファイルにまとめる)ことだけで、圧縮(zip化)はできないという点。

find ファイルPATH <検索条件> -exec tar -rvf 作成するアーカイブファイルPATH {} \...

Linuxで、0バイトのファイルや空ディレクトリを一括削除するには、どうすればよいのだろうか。
答えは簡単で、findコマンド一発でできる。

find PATH -empty -delete
[root@BS-PUB-CENT7-01 tmp]# mkdir -p /tmp/empty/{aaa,bbb,ccc,ddd,eee/fff}
[root@BS-PUB-CENT7-01 tmp]# touch /tmp/empty/{1,2,3,4,5}
[root@BS-PUB-CENT7-01 tmp]# echo ' ' > /tmp/empty/6
[root@BS-PUB-CEN...

linuxで指定したファイルの合計サイズを取得する

linuxで、ディレクトリ内のファイルの合計容量を取得するのではなく、個別に指定したファイル(ワイルドカードで拡張子等を指定したファイルなど)の合計サイズを取得する場合、大まかに分けて2つの方法がある。

1.ls(find)とawkで容量の合計を計算する

ls(+find)とawkで、指定したファイルの合計容量を取得することができる。
lsの実行結果を、awkコマンドで加工する事で合計容量の取得を行えば良い。計算対象をうまく記述出来なければ、ファイルにPATHを記述して$(cat ファイル)で読み出せば良い。

もしCentOS7もしくはUbuntu 14.04以降のOSで、かつ人...


UNIX・Linuxでファイル名・フォルダ名の一括置換を行う

LinuxやUNIXを利用していると、スクリプト名などのファイル名のルールが変更したため、一括で置換を行いたいときがある。 そんな時は、どうすればいいのだろうか?

1.『rename』コマンドを利用する

もし『rename』コマンドがあるようならば、これを利用するといいだろう。 Linuxには大体最初から用意されている。(なお、Ubuntuの場合だと置換の指定方法がPerl(sed)の指定方法になっている)

rename 置換する単語 置換後の単語 対象PATH

この対象PATHにはワイルドカードも利用できるので、以下のように一括で置換を行える。

[root@test-...

シンボリックリンクということは、オリジナルのファイルやフォルダといったものが存在することになる。 そして、シンボリックリンクはファイルやフォルダに対してのみではなく、シンボリックリンクに対しても作成することが出来る。

今回は、このシンボリックリンクとオリジナルファイルの関連を追う方法について紹介する。 なお、サンプル環境は以下のようになっている。

[root@test-centos7 ~]# ls -la $(find /sample* -type l -or -type f)
-rw-r--r--. 1 root root  0  6月  6 17:18 /sample/test.t...

ファイルの削除前に、そのファイルを参照しているシンボリックリンクを確認する

特定のファイルを削除する前に、そのファイルを参照しているシンボリックリンクの有無を確認する場合、findコマンドを利用すると良いだろう。

ls -la $(find -L /シンボリックリンクがあるフォルダのPATH -samefile /オリジナルファイルのPATH)

たとえば、「/work」「/home」配下にある、「/work/test.txt」のシンボリックリンクを確認する場合、以下のようにコマンドを実行する。

ls -la $(find -L /{work,home} -samefile /work/test.txt)

[root@test-centos7 ~]#...

findコマンドで覚えておきたい使い方12個(+1個)

LinuxやUNIXで仕事をしていると、特定のファイル(名前だったり、さっき編集されたファイルだったり)がどこにあるのかを知りたい事が多々ある。
そんな時は、やはりfindコマンドの出番だ。今回は、そんなfindコマンドで覚えておきたい便利な使い方についてまとめてみる事にした。

1.ファイル名で検索する

まずは基本。findコマンドでは最も利用されているであろうファイル名での検索。
例えば、以下のように「-name」オプション付きでコマンドを実行することで、「test」というファイルが出力される。

このキーワードは、最下層(ディレクトリであれば一番下のディレクトリ、ファイルであ...