2012-02-08 24 views
18

kshスクリプトでfindコマンドを使用していますが、フルパスではなくファイル名を取得しようとしています。で、//severname/dir1/dir2/text.exeではなくtext.exeを返すようにします。ありFindはファイル名だけを出力し、フルパスは出力しません

どうすればそれを取得できますか?明確にするために、私はファイルが入っているディレクトリを知っている、私はちょうど作成されたものを取得しているので、パス名は重要ではない。

+2

[ファイル名はlinux \ 'find \'で取得するだけですか?](http://stackoverflow.com/questions/5456120/how-to-only-get-file-name- with-linux-find) – BroSlow

+0

これも[こちら](http://stackoverflow.com/questions/5456120/how-to-only-get-file-name-with-linux-find)と回答しています。 – sebastian

+0

このファイルは重複しています。https://serverfault.com/questions/354403/remove-path-from-find-command-output – michael

答えて

6

あなたがそれを行うことができます。しかし、それは本当に意味をなさないん

find ..... |sed 's#.*/##' 

?異なるディレクトリにある同じファイル名を持つ2つのファイルがある場合、それらをどのように区別できますか?

you are in /foo 

/foo/a.txt 
/foo/bar/a.txt 

EDIT

編集いくつかの優れたテキストの書式を得るための答え。あなたはコメントで説明したように

、あなたが

  1. にしたいので、いくつかのファイル、
  2. 、ディレクトリにコピー見つけるアーカイブにそれらをgzipをコピー
  3. 削除a.gz言いますファイルが手順2で成功した場合にのみ

これはワンショットで実行できます。

find ...|xargs tar -czf /path/to/your/target/a.gz 

これはファイルを見つけ、ターゲットディレクトリにtar(a.gz)を作成します。

+0

私はfindを使用しています。なぜなら、後で作成されたすべてのファイルを取得しようとしているからです。特定の日付、-mtimeを使用しています。より良い方法がありますか? – Steve

+0

@ Steve 'find'で見つけたファイルで何をするつもりですか?ディレクトリ情報を削除する特別な要件はありますか? – Kent

+1

ええ、私はそれらを別のディレクトリにコピーしてからそれらを使って作業するので、実際にファイル名を指定するだけです。それ以外の場合は、Findを再度実行する必要があります。 – Steve

8
find ... -exec basename {} \; 

でもトリックを行いますが、@Kentが尋ねるように、なぜこれをしたいですか?

+0

この答えのように '-exec'を使用すると、見つかったすべてのファイルに対して外部プログラムが実行されます。 '-printf'オプションを使った@ glennjackmanの答えは、ファイルの数やオペレーティングシステムによりますます高速になります。 –

+0

@StéphaneGourichonこれはGNU以外のシステムにとっては良い答えです。 OpenBSDの 'find'には' -printf'がありません – sheepdog

+0

また、(GNU以外のものには必ずしも当てはまるわけではありませんが)複数の引数を渡すことができる 'basename -a'オプションがあり、' find'オプションは渡すことができます'-exec'には複数の引数があるので、実際にパフォーマンスが問題になる場合は、' find ... -exec basename -a {} + '(' \; 'の代わりに' + 'を書きます) – michael

51

あなたはGNUが見つけ使用している場合は、

find path -printf "%f\n" 

は、単にファイル名を印刷して、パスを除外します。

2

ここに別の答えがあります。

find | awk -F/ '{print $NF}'  
関連する問題