Linux で絶対パスを含むファイルのリストを生成するにはどうすればよいですか?
-
05-07-2019 - |
質問
ファイルパスを入力として受け取るシェルスクリプトを作成しています。
このため、フルパスを含む再帰的なファイルリストを生成する必要があります。たとえば、ファイル bar
パスがあります:
/home/ken/foo/bar
しかし、私が見る限り、両方とも ls
そして find
相対パスのリストのみを提供します。
./foo/bar (from the folder ken)
明らかな要件のように思えますが、 find
または ls
マニュアルページ。
絶対パスを含むファイルのリストをシェルで生成するにはどうすればよいですか?
解決
find
に最初から絶対パスを指定すると、絶対パスが出力されます。たとえば、現在のディレクトリですべての.htaccessファイルを見つけるには:
find "$(pwd)" -name .htaccess
またはシェルが $ PWD
を現在のディレクトリに展開する場合:
find "$PWD" -name .htaccess
find
は、指定されたパスを、そのパスからのファイルへの相対パスに単に追加します。
グレッグヒューギルは、シンボリックリンクを解決する場合は、 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
bashで
ls -d "$PWD/"*
これは、 current ディレクトリのみを検索します。 " $ PWD"を引用します。スペースが含まれている場合。
$ PWD
は、上記のMatthewによる優れたオプションです。ファイルのみを印刷する場合は、-type fオプションを追加して、通常のファイルのみを検索することもできます。その他のオプションは「d」です。ディレクトリのみなど。だからあなたの場合、それは次のようになります(拡張子が.cのファイルのみを検索したい場合):
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 だけです)。
コマンド: 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
lspwd() { for i in $@; do ls -d -1 $PWD/$i; done }
これは、余分なピリオドなしでリストを印刷し、ファイルの一致を検索する方法を示す例です。これが役に立てば幸いです:
find . -type f -name "extr*" -exec echo `pwd`/{} \; | sed "s|\./||"
find / -print
がこれを行います
ls -1 | awk -vpath=$PWD/ '{print path$1}'