UNIXの「検索」で先頭の「./」を取り除く方法は?


140
find . -type f -print

印刷する

./file1
./file2
./file3

印刷する方法

file1
file2
file3


1
で使用-exec /path/to/myscript.sh {} した場合find、は-printf '%P\n'機能しません。代わりに、私がしなければならない./:によってスクリプト内ムシャムシャ接頭辞をp=${1#"./"}
truthadjustr

単一のファイルだけで実行する場合:f=`find . -name migration`; echo ${f/.\//}
masterxilo

回答:


38

現在のディレクトリのみにある場合

find * -type f -print

それでいいの?


21
これは、ピリオドで始まる名前のファイルを見逃します。
Sean

2
シェルの設定によっては、*が「非表示」のファイル/ディレクトリ(ドット(。)で始まるもの)に評価されない場合があります。このコマンドをホームディレクトリで実行し、「find -type f」を実行して、違いを確認してください。
Ilia K.

35
より重要な問題は、「*」がシェルによって評価されることです。ある種の悪意のあるコードインジェクション状況が事実上発生しています。'--exec rm'という名前のファイルと 'zzzz;'という名前のファイルを作成するのは簡単です。さようならファイル。
CWF 2010

6
これは安全ではありません。ファイル名がダッシュで始まる場合、それは検索するオプションとして扱われ、失敗するか、損傷する可能性があります。
デールアンダーソン

4
なぜ-print必要なのですか?そのフラグがなくても同じ結果が得られました。
user13107

239

現在のディレクトリで通常のファイルのみを検索し、「./」プレフィックスなしでそれらを印刷します。

find -type f -printf '%P\n'

man findから、-printfフォーマットの説明:

%Pファイルの名前と削除されたコマンドライン引数の名前。


18
+1お使いのバージョンがfindサポートしている場合-printf(すべてがサポートしているわけではありません)、優れたソリューション。
Todd Owen

2
それはPOSIX 7.ではない:トッドは言ったが、より正確通り
チロSantilli郝海东冠状病六四事件法轮功

8
サポートされているかどうかにかかわらず、受け入れられた回答よりも間違いなく安全です。
デールアンダーソン

10
それをパイプしたい場合(たとえば、ファイル名に空白が含まれる場合)の\0代わりに使用できます。例:\nxargs -0find -type f -printf '%P\0' | xargs -0 head
seanf

1
@Quanlong、あなたがMacOSで動作する場合brew install findutils;)
blockloop '11年

58

sedを使用する

find . | sed "s|^\./||"

2
これが私の推奨するソリューションです。これはPOSIX互換であり(組み込みシステムを含め、ほぼすべての場所で機能します)、非常に短く、予期しない動作を引き起こす可能性はほとんどありません。これは受け入れられる答えになるはずです。
Jody Bruchon、2016年

6
これはどのように組み合わせるのfind -execでしょうか?
Paul Wintz 2017年

find -exec sh -c "echo {} | sed 's|^\./||'" \; または find -exec sh -c "sed 's|^\./||' <<< '{}'" \;
xenithorb 2017年

12

短くすることができます

find * -type f

2> /dev/null空のディレクトリでコマンドを実行したときに報告されるエラーを無視する方がよいでしょう。
neevek 2016


2

./を取り除く別の方法

find * -type d -maxdepth 0

このコードは問題を解決する可能性がありますが、これが問題を解決する方法と理由の説明含めると、投稿の品質が向上し、おそらく投票数が増えることになります。あなたが今尋ねている人だけでなく、あなたが将来の読者のための質問に答えていることを忘れないでください。回答を編集して説明を追加し、適用される制限と前提を示してください。
David Buck

2

以来-printfオプションはOSX上で使用できないfind、ここで誰かがインストールしたくない場合はOSX上の作品は念のために、見つけることを一つのコマンドでgnu find使用brewなどは:

find . -type f -execdir printf '%s\n' {} + 

1
残念ながら、これは、見つかった各ファイルのパス(中間サブディレクトリを含む)をすべて削除し、ファイル名自体を出力するだけです。
PLL

1
あなたが正しいです。このソリューションは、現在のディレクトリ内のファイルにのみ適しています。:私たちが使用する必要があるネストされたファイルの場合find . -type f -exec bash -c 'for f; do echo "${f#./}"; done' {} +
anubhava
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.