web-dev-qa-db-ja.com

Linuxで絶対パスを使ってファイルのリストを生成する方法を教えてください。

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

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

/home/ken/foo/bar

しかし、私の知る限りでは、lsfindは両方とも相対パスのリストを与えるだけです。

./foo/bar   (from the folder ken)

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

絶対パスを含むシェルでファイルの一覧を生成する方法を教えてください。

237
Ken

findに絶対パスを指定すると、絶対パスが表示されます。たとえば、現在のディレクトリにあるすべての.htaccessファイルを見つけるには、次のようにします。

find "$(pwd)" -name .htaccess

シェルが$PWDを現在のディレクトリに展開した場合

find "$PWD" -name .htaccess

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

Greg Hewgill あなたが現在のディレクトリのシンボリックリンクを解決したい場合はpwd -Pを使うことも提案しました。

243
readlink -f filename 

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

177
balki

ディレクトリに使用します(ディレクトリに限定するために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は再帰的になります。

100
user431529

あなたが使用することができます

find $PWD 

一気に

25
Vinko Vrsalovic
ls -d "$PWD/"*

これは current ディレクトリ内だけに見えます。スペースが含まれている場合は、 "$ PWD"を引用符で囲みます。

12
didi

$PWDは上記のMatthewによる良い選択肢です。ファイルのみを印刷したい場合は、-type fオプションを追加して通常のファイルのみを検索することもできます。他のオプションはディレクトリ専用の "d"などです。だからあなたの場合はそうなるでしょう(もし私が.c extのファイルだけを検索したいのなら):

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

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

find $PWD -type f

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

5
Gurpreet

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

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

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

あなたが得るはずです:

/home/ken/foo/bar

したがって、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で機能することがわかります)。

4
Trudius

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

find . -type f -name "extr*" -exec echo `pwd`/{} \; | sed "s|\./||"
1
Mike Behr
lspwd() { for i in $@; do ls -d -1 $PWD/$i; done }
1
rwilhelm

コマンド: 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
0
GSMurthy