Linuxで絶対パスを含むファイルのリストを生成するにはどうすればよいですか?


304

ファイルパスを入力として受け取るシェルスクリプトを書いています。

このため、フルパスで再帰的なファイルリストを生成する必要があります。たとえば、ファイルbarのパスは次のとおりです。

/home/ken/foo/bar

しかし、私の知る限りでは見ることができるように、両方lsfindだけ相対パスのリストを与えます:

./foo/bar   (from the folder ken)

明らかな要件のように見えますが、findまたはlsmanページには何も表示されません。

シェルで絶対パスを含むファイルのリストを生成するにはどうすればよいですか?


使用:find /home/ken/foo/bar -exec ls -ld $PWD/{} \;
学習者

回答:


305

あなたが与える場合findに開始するための絶対パスを、それは絶対パスを出力します。たとえば、現在のディレクトリにあるすべての.htaccessファイルを見つけるには、次のようにします。

find "$(pwd)" -name .htaccess

または、シェル$PWDが現在のディレクトリに展開される場合:

find "$PWD" -name .htaccess

find 与えられたパスを、そのパスからのファイルへの相対パスに付加するだけです。

Greg Hewgillさんpwd -Pは、現在のディレクトリのシンボリックリンクを解決したい場合に使用することも提案しました。


9
シンボリックリンクも解決したい場合は、を使用してくださいpwd -P
Greg Hewgill、

5
:これは便利ですが、私は以下のuser431529の応答がより有効であると思います ls -d -1 $PWD/**/*が、私は推測find $PWDも(bashでテストした)作品
ブライアン・

9
@ブライアンなぜですか?find $PWD簡単です。ls呪文は(あなたがそれをエイリアスしない限り)、複雑で扱いにくいです。findシェルグロブ展開に依存しないため、どのシェルでも機能します。findまた、はるかに柔軟です。すべてのファイル、またはおそらくすべてのディレクトリの再帰的なリストを取得できます。または、すべてのxmlファイルのリスト、または先週変更されたすべてのファイルのリストが必要な場合もあります。でそれが可能ですがfind、では簡単にはできませんls
Matthew Scharley、2011

12
find "`pwd`" -name .htaccessディレクトリ名にスペースが含まれていたため、使用しなければなりませんでした
Paulo Casaretto 2012

わかりません。このコマンドではファイルの絶対パスが表示されないので、リストの下にある他の回答でうまくいきます。
ビョルンオットーVasbotten

202
readlink -f filename 

完全な絶対パスを指定します。しかし、ファイルがシンボリックリンクの場合、最終的に解決された名前が取得されます。


8
いいね。readlinkのBSDバリアント(つまりMac)では機能しません。Macではgnucoreutilsを使用します。したがって、上記のソリューションで動作するgreadlinkを使用できます。
シェキ2011

12
マックOS X.には行くん
アンドリュー・ラザロ

1
@AndrewLazarus-Mac OS Xの場合は、realpath代わりに使用してください
cz

あなたが経由でbashのツールをインストールした場合brew install coreutils、その実行可能ファイルは、としてインストールされます/usr/local/opt/coreutils/libexec/gnubin/readlink
しのばせる

121

これをdirsに使用します(bashではこれをディレクトリに制限するために/**が必要です):

ls -d -1 "$PWD/"**/

これは、現在のディレクトリの直下にあるファイルおよびディレクトリで、名前に.

ls -d -1 "$PWD/"*.*

これはすべて:

ls -d -1 "$PWD/"**/*

ここから取得 http://www.zsh.org/mla/users/2002/msg00033.html

bashでは、**を有効にすると再帰的ですshopt -s globstar


1
ls -d -1 $ PWD / ** / *は再帰しません。+1を取り戻したいと思います。ただし、必要な深度ごとに**を実行できます。
user606723 '08 / 08/23

4
**演算子は再帰的グロビング演算子です。コマンドをサポートするシェル(zshなど)でコマンドを使用すると、正しく動作します。
zebediah49

ls -d1 "$ PWD /"{*,.*}は、隠し(ドット)ファイルもキャッチします。私にとって、回答の再帰バージョンは、サブフォルダー内のファイルへの絶対パスを付加しませんでした。
Zael

findを使用する必要があると思います... bash:/ bin / ls:引数リストが長すぎます
TelamonAegisthus

30

使用できます

find $PWD 

バッシュで


3
これにより、現在のディレクトリ、およびその下のすべてのファイルとディレクトリのパスも取得されます。それはおそらく人々が探しているものではありません。
ビル・

18
ls -d "$PWD/"*

これは現在のディレクトリのみを検索します。スペースが含まれている場合は、「$ PWD」を引用します。


これはまだ非常に有効な回答ですが、これが再帰的に機能しないという情報を含めるとよいでしょう(これは実際に私が探していたものです)
bbbco

1
再帰的に使用する場合:find。-exec ls -ld $ PWD / {} \;
学習者

10

コマンド: ls -1 -d "$PWD/"*

これにより、ファイルの絶対パスが次のようになります。

[root@kubenode1 ssl]# ls -1 -d "$PWD/"*
/etc/kubernetes/folder/file-test-config.txt
/etc/kubernetes/folder/file-test.txt
/etc/kubernetes/folder/file-client.txt

8

これ$PWDは上記のマシューによる良い選択です。印刷ファイルのみを検索する場合は、-type fオプションを追加して、通常のファイルのみを検索することもできます。他のオプションは、ディレクトリのみの場合は「d」などです。したがって、あなたの場合はそうです(.c拡張子を持つファイルのみを検索したい場合):

find $PWD -type f -name "*.c" 

または、すべてのファイルが必要な場合:

find $PWD -type f

注:上記のコマンドのエイリアスは作成できません。$ PWDは、bashによってエイリアスが設定されているときにホームディレクトリにオートコンプリートされるためです。


実際、-dはディレクトリだけを意味するのではなく、ディレクトリをファイルのように扱うことを意味します。したがって、ls -d / homeを実行すると、/ homeにあるもののリストではなく、「/ home」が返されます。
Travis、

@Travis:彼はlsではなく、見つけるオプションについて話していました。彼の場合、「find / -type d」はディレクトリのみを検索します-彼が言ったように。
オリゴフレン

6

findコマンドに絶対パスを指定すると、絶対パスで結果が出力されます。したがって、次のように入力した場合、Kenディレクトリから:

find /home/ken/foo/ -name bar -print    

(相対パスの代わりにfind . -name bar -print

あなたは得るべきです:

/home/ken/foo/bar

したがって、an ls -lが必要で絶対パスを返すようにしたい場合は、findコマンドに、見つかったものに対してを実行するよう指示するだけls -lです。

find /home/ken/foo -name bar -exec ls -l {} ;\ 

注:{}との間にはスペースがあります;

あなたはこのようなものを得るでしょう:

-rw-r--r--   1 ken admin       181 Jan 27 15:49 /home/ken/foo/bar

ファイルの場所がわからない場合は、いつでも検索場所を変更できます。検索パスが「/」で始まる限り、代わりに絶対パスを取得します。多くのアクセス許可拒否エラーが発生する場所(/など)を検索している場合は、検索結果を実際に確認できるように、標準エラーをリダイレクトすることをお勧めします。

find / -name bar -exec ls -l {} ;\ 2> /dev/null

2>はBorneシェルとBashシェルの構文ですが、Cシェルでは機能しません。他のシェルでも機能する可能性がありますが、確実にBourneとBashで機能することを知っています)。


を使用して、同じlsプロセスに複数の引数を渡すことができ-exec ls -ld {} +ます。(おそらく、ディレクトリの内容-dlsリストにしたくないでしょう)。以上、使用検索が組み込まれていますlsfind ... name bar -ls。また、コマンドごとに1つの引数の構文が間違っています{} \;。シェルからセミコロンを引用符で囲む必要があるためです。
Peter Cordes

5

fd

使用するfd(代替にするfind)、次の構文を使用します。

fd . foo -a

どこに.検索パターンで、fooルートディレクトリです。

たとえば、すべてのファイルをetc再帰的に一覧表示するには、次を実行しますfd . /etc -a

-a--absolute-path 相対パスではなく絶対パスを表示


2

の代わりに

ls -d "$PWD/"* 

*シェル展開であることを特定するには、

echo "$PWD/"*

同じことを行います(-1スペースではなく改行で区切るために使用できない欠点)。


これについて詳しく説明できますか?シェル拡張とは何ですか?-1行ごとに分離する方法
Antonio Araujo

@Antonio Araujo、シェル拡張はシェル(例:bash)が*をファイルのリストに置き換えます-bashのmanページで詳細を読むことができます。-1はlsコマンドオプション、echoは他のコマンド、同じオプションはありません。
マリシャ

1
lspwd() { for i in $@; do ls -d -1 $PWD/$i; done }

1

次の例は、余分なピリオドなしでリストを出力し、ファイルの一致を検索する方法も示しています。お役に立てれば:

find . -type f -name "extr*" -exec echo `pwd`/{} \; | sed "s|\./||"

1

これでうまくいきました。しかし、アルファベット順ではありませんでした。

find "$(pwd)" -maxdepth 1

このコマンドは、アルファベット順にリストするだけでなく、隠しファイルもリストします。

ls -d -1 "$PWD/".*; ls -d -1 "$PWD/"*;


1

これを試してみてください。

for name in /home/ken/foo/bar/*
do
    echo $name
done

あなたはforループを使用して、echo単になしでABSパスを取得することができますfind


0

現在のすべてのファイルとサブディレクトリのリストが必要な場合

find $PWD -type f

現在のディレクトリにあるすべてのファイルのリストが必要な場合

find $PWD -maxdepth 1 -type f

0

これは正規パスを提供します(シンボリックリンクを解決します): realpath FILENAME

シンボリックリンク自体への正規パスが必要な場合は、次のようにします。 realpath -s FILENAME


0

パスにスペースが含まれている場合、推奨されるすべての方法ではないにしても、ほとんどの場合、他の端末コマンドで直接使用できないパスになります。理想的には、結果の前にスラッシュが付いています。これは私にとってmacOSで動作します:

find / -iname "*SEARCH TERM spaces are okay*" -print 2>&1  | grep -v denied |grep -v permitted |sed -E 's/\ /\\ /g'

-1

find / -print これを行います


1
...残念ながら、それは何か他のことをします(フィルタリングしない限り、「他のいくつかのファイルを表示する」など)
DerMike

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.