入力としてファイルパスを受け取るシェルスクリプトを書いています。
このため、フルパスで再帰的ファイルリストを生成する必要があります。たとえば、ファイルbar
のパスは次のとおりです。
/home/ken/foo/bar
しかし、私の知る限りでは、ls
とfind
は両方とも相対パスのリストを与えるだけです。
./foo/bar (from the folder ken)
これは明らかな要件のように思えますが、find
またはls
のmanページには何も表示されません。
絶対パスを含むシェルでファイルの一覧を生成する方法を教えてください。
find
に絶対パスを指定すると、絶対パスが表示されます。たとえば、現在のディレクトリにあるすべての.htaccessファイルを見つけるには、次のようにします。
find "$(pwd)" -name .htaccess
シェルが$PWD
を現在のディレクトリに展開した場合
find "$PWD" -name .htaccess
find
は単にそのパスからファイルへの相対パスに与えられたパスを追加するだけです。
Greg Hewgill あなたが現在のディレクトリのシンボリックリンクを解決したい場合はpwd -P
を使うことも提案しました。
readlink -f filename
絶対パスを指定します。しかし、ファイルがシンボリックリンクの場合は、最終的に解決された名前が得られます。
ディレクトリに使用します(ディレクトリに限定するために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
は再帰的になります。
あなたが使用することができます
find $PWD
一気に
ls -d "$PWD/"*
これは current ディレクトリ内だけに見えます。スペースが含まれている場合は、 "$ PWD"を引用符で囲みます。
$PWD
は上記のMatthewによる良い選択肢です。ファイルのみを印刷したい場合は、-type fオプションを追加して通常のファイルのみを検索することもできます。他のオプションはディレクトリ専用の "d"などです。だからあなたの場合はそうなるでしょう(もし私が.c extのファイルだけを検索したいのなら):
find $PWD -type f -name "*.c"
またはすべてのファイルが必要な場合は、
find $PWD -type f
注:上記のコマンドにエイリアスを作成することはできません。エイリアスがbashによって設定されていると、$ PWDがホームディレクトリに自動補完されるためです。
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で機能することがわかります)。
これは、余分なピリオドを付けずにリストを出力し、ファイルの一致を検索する方法も示す例です。お役に立てれば:
find . -type f -name "extr*" -exec echo `pwd`/{} \; | sed "s|\./||"
lspwd() { for i in $@; do ls -d -1 $PWD/$i; done }
コマンド: 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