ディレクトリ内のすべてのファイルを絶対パスでリストする方法


30

ディレクトリ内のすべてのファイルの絶対パスを含むファイル(できれば.listファイル)が必要です。

例dir1:file1.txt file2.txt file3.txt

listOfFiles.list

/Users/haddad/dir1/file1.txt
/Users/haddad/dir1/file2.txt
/Users/haddad/dir1/file3.txt

linux / macでこれを達成するにはどうすればよいですか?

回答:


30
ls -d "$PWD"/* > listOfFiles.list

これはRed Hat Linuxで動作しますか?
arabian_albert

4
このコマンドは LinuxまたはUNIXオペレーティングシステムで動作します。1行に1つのファイルを取得する場合は、使用する必要がありますls -d -1 $PWD/*
-MelBurslan

1
ファイル名が長い場合や端末の幅が狭い場合は、そうです。ただし、端末ウィンドウを最大化して画面全体を占めるようにするか、ファイル名(パスを含む)が本当に短い場合は、保持されません。本当。-1オプションは、行ごとに1つのファイル名を取得することを保証します
-MelBurslan

7
@MelBurslanの追加は、出力が端末への場合にのみ必要です。ls出力がファイルまたは端末に対するものかどうかを検出します。
ルニウム

9
ディレクトリに数千のファイルがある場合、つまり、コマンドラインの最大サイズを超えるほど十分な場合(シェルがファイル名をフルパスで展開している可能性が高いため)、これは失敗します。@Andy Daltonのfind答えは、リストするファイルの数に関係なく失敗しないため、より良いソリューションです。
cas

33

findを使用できます。通常のファイルのみが必要であると仮定すると、次のことができます。

find /path/to/dir -type f > listOfFiles.list

他の種類のファイルが必要な場合は、必要に応じてtypeパラメーターを調整できます。


7
より将来性のあるソリューションを指すための+1 ls。これfindはサブディレクトリを再帰します。非再帰の場合、引数の-maxdepth 1前に追加する必要があり-typeます。
クバンチク

@AndyDalton bashの配列に同じを取得する方法
Kasun Siyambalapitiya

13

次のことに注意してください。

ls -d "$PWD"/* > listOfFiles.list

ディレクトリ内の(隠されていない)ファイルのリストを計算し、そのリストをに渡すのはシェルですlslsここにリストを印刷するだけなので、次のこともできます。

printf '%s\n' "$PWD"/*

3
を使用すると、別のプロセスとして実行されないため、printf数千のファイルがある場合に「コマンドラインが長すぎます」というエラーが発生しないというボーナスが追加さprintfれます。
エイドリアンプロンク

2
@AdrianPronk、はい、printfビルトインされていないシェル、pdkshおよびその派生物の一部またはBourneシェルのほとんどのバージョンを除きます。1つの欠点ls -dは、隠されていないファイルが存在しない場合に印刷され/path/to/*ls代わりにそのファイルが存在しないというエラーが表示されることです。
ステファンシャゼラス16年

10

通常のファイルだけを表示するには-

find "$PWD" -type f  > output

3

realpathまたはを使用できますreadlink

ls | xargs realpath
  • xargs 標準入力からコマンドラインをビルドおよび実行します。
  • realpath:正規化された絶対パス名を返します
  • readlink:シンボリックリンクの値を読み取る

realpath:コマンドが見つかりません
-rogerdpack

@rogerdpack coreutilsパッケージはインストールされていますか?その情報はで取得しdpkg -S /usr/bin/realpathます。チェックアウトこれを
パブロA

3

別の方法tree:ここで言及されていないが、それはあなたが(のようなすべてのエラーを持っていない再帰的とは違っ検索やlsを行くPermission deniedNot a directory場合は、絶対パスを取得するあなたも、あなたがにファイル送りたい)xargs、または他のコマンドを

tree -fai /pathYouWantToList >listOfFiles.list

オプションの意味:

-a     All  files  are  printed.  By default tree does not print hidden files (those beginning with a dot
       `.').  In no event does tree print the file system constructs `.'  (current  directory)  and  `..'
       (previous directory).

-i     Makes tree not print the indentation lines, useful when used in conjunction with the -f option.

-f     Prints the full path prefix for each file.

インストールするtree

sudo apt install tree Ubuntu / Debianで

sudo yum install tree CentOS / Fedoraで

sudo zypper install tree OpenSUSEで


1
ツリー:コマンドが見つかりません
-rogerdpack

OpenSUSE 上のCentOS sudo apt install tree上のUbuntuの @rogerdpack sudo yum install treesudo zypper install tree
エデュアルドフロリネスク

1
brew install treeMacで
oOEric

2

過去のLinux環境では、 resolve、相対パスを絶対パスにするなど、パスを標準化コマンドがありました。私は今それを見つけることができないので、多分それはその組織の誰かによって書かれたでしょう。

PythonまたはPerl標準ライブラリ(およびおそらく他の言語)の関数を使用して、独自のスクリプトを作成できます。

resolve.py

#!/bin/env python

import sys
import os.path

for path in sys.argv:
    print os.path.abspath(path)

resolve.pl

#!/bin/env perl

use warnings;
use Cwd qw ( abs_path );

foreach (@ARGV) {
    print abs_path($_), "\n";
}

次に、次の方法で問題を解決します。

resolve.py * > listOfFiles.list

このコマンドを使用すると、次のようなこともできます。

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