lsコマンド:ファイルごとに1行ずつ、再帰的なフルパスリストを取得するにはどうすればよいですか?


493

どうすればlsに再帰的な1行ごとのパスのフラットリストを出力させることができますか?

たとえば、完全なパスを含むファイルのフラットリストが必要です。

/home/dreftymac/.
/home/dreftymac/foo.txt
/home/dreftymac/bar.txt
/home/dreftymac/stackoverflow
/home/dreftymac/stackoverflow/alpha.txt
/home/dreftymac/stackoverflow/bravo.txt
/home/dreftymac/stackoverflow/charlie.txt

ls -a1 私はほとんど私が必要とすることを行いますが、私はパスの断片が必要ではなく、フルパスが必要です。


次も参照: ツリー
dreftymac

回答:


386

本当に使用したい場合はls、awkを使用して出力をフォーマットします。

ls -R /path | awk '
/:$/&&f{s=$0;f=0}
/:$/&&!f{sub(/:$/,"");s=$0;f=1;next}
NF&&f{ print s"/"$0 }'

5
@dreftymac。これは、客観的に言えば、意図的かどうかにかかわらず、あなたが書いた質問に対する正しい答えであることを意味します。はい、多分それはあなたが書いたい思っていた質問に対する正しい答えではなかったでしょう。そして、私はあなたのより大きな点に同意しますが、「賢明な人が月を指すとき、愚か者は指を見る」、特に基準に可能性のあいまいさがない場合、正しさを評価するために主観性の影響を最小限に抑えることは公正です
lurscher 2012年

1
@dreftymac、私は投票を変更して喜んでいますが、ロックされています。投票を更新できるように質問を編集する必要があります
lurscher

7
誰かが上記のawk表現を説明できますか?
Mert Nuhoglu 2014年

2
このソリューションはディレクトリを省略しません(各ディレクトリは独自の行を取得します)
JayB

2
ありがとう。ところで、簡単なコピーと貼り付けのために、これを1行にすると便利です。
レオウフィムツェフ2018年

567

検索を使用:

find .
find /home/dreftymac

ファイルのみが必要な場合(ディレクトリ、デバイスなどを省略):

find . -type f
find /home/dreftymac -type f

2
このソリューションで「利用」されたlsようなパラメーターはあります--sort=extensionか?
n611x007 2012

必要なコンテキスト情報を表示するために、printf出力を使用することもできます(たとえば、find。-type f -printf '%p%u \ n')
xsubira

これはfalgでフォーマットできますか?すなわち。python pprint.pprint(files)
Nathan

72

ls -ld $(find .)

出力を変更時間でソートしたい場合:

ls -ltd $(find .)


11
-bash:/ bin / ls:引数リストが長すぎます
jperelli

1
+1は12106個のファイルで機能し、次の--sort=extensionパラメーターを使用できますls
n611x007

3
ありがとう。私は自分でその(ナイスで短い)構文を考えていなかったでしょう-私はfind . -name "*" -exec ls -ld '{}' \;(ファイル数が何であっても機能する)を使用したでしょうが、コマンドは書く方がずっと短いです;)
SRG

1
そのようなファイルやディレクトリが@SRGによって引用符で見つけていない作品:LS:ないアクセス./Systemができるファイルがスペースを持っているところ、私はNTFSディスクをリストアップしていた場合、LSは私のために$(。見つける。)休憩を-ld
kuz8

(ニーズに応じて)より短い代替案はですfind . -ls
IanS

59

次の簡単な方法を試してください。

find "$PWD"

9
find "`pwd`"パスにスペースまたはその他の特殊文字が含まれている場合。
mustafa.0x 2013

7
これはどう違うのですfind .か?-.-
Salman von Abbas 14

7
@SalmanPK最初に「絶対パス」pwdを指定すると、絶対パスが出力されます。ちなみに、「これはどのように違うのですかfind」;-)
yckart

44

最高のコマンドは: tree -fi

リンクではなくファイルを使用するに>は、出力から削除する必要があります。

tree -fi |grep -v \>

各ファイルの性質を知りたい場合(たとえば、ASCIIファイルのみを読み取る場合)、2つwhileのsを使用します。

tree -fi | \
grep -v \> | \
while read first ; do 
    file ${first}
done | \
while read second; do 
    echo ${second} | grep ASCII
done

ありがとう、知らなかったtree
Dan Filimon、2012年

@Nakilon最も近いものは何ですか?同様に出力を表示しますか?短いコマンドで同様の出力を簡単にどのよう表示しますか?
om01 2013

6
@ om01:brew install tree自作を使用していることを考えると、osxではが難しい
ccpizza '28

排他的なファイルをリストできませんでした。常にディレクトリもリストされます。どうやってやるの?
kommradHomer

これはかなり高く評価されるべきです!
der_grund

44

ああ、本当に長い答えのリスト。それは非常に役立ち、最後に、私が探していた自分のものを作成しました:

ディレクトリとそのサブディレクトリ内のすべてのファイルを一覧表示するには:

find "$PWD" -type f

ディレクトリとそのサブディレクトリ内のすべてのディレクトリを一覧表示するには:

find "$PWD" -type d

ディレクトリとそのサブディレクトリ内のすべてのディレクトリとファイルを一覧表示するには:

find "$PWD"

2
そして拡張子でフィルタリングするには:find "$PWD" -type f | grep '\.json$'
Killroy

2
grepで後処理する必要はありません。-nameを次のように検索で使用します。 "$ PWD" -type f -name * .jsonを検索し、リストされているファイルを削除する場合: "$ PWD" -type f -name *を検索します.json -exec rm {} \; 同様に、コピーしたい場合は、rmをcpおよびdestinationに置き換えます。
Godfather

18

完全なパスはわかりませんが-R、再帰的に使用できます。代わりに、あなたが屈服していない場合はls、あなただけを行うことができますfind *


16

ls以外の外部コマンドを使用しない:

ls -R1 /path | 
  while read l; do case $l in *:) d=${l%:};; "") d=;; *) echo "$d/$l";; esac; done


不明なオプション '-1'。中止します。
ilw 2017

15
du -a

find / locateが利用できない一部の限られたアプライアンスシェルに便利です。


1
どのようにしてファイルサイズを削除することができawkますか?
Arnold Roa 2016


10

複雑にしないでください。私はこれを使用して、美しい出力を得ました:

ls -lR /path/I/need

3
OPは完全なパスのみを望み、それ以外は何も要求しません。 ls -lRその目標を達成しないでしょう。
codeforester 2017

申し訳ありませんが、それは行いません
Aryeh Beitz

9

すべての将来の人々のための最も簡単な方法は簡単です:

du

ただし、これは各フォルダーに含まれるもののサイズも示します。awkを使用してフォルダー名のみを出力できます。

du | awk '{print $2}'

編集-すみません、すみません。必要なのはフォルダだけだと思いました。将来の誰かがとにかくそれを必要とする場合に備えて、これをここに残します...


興味深いのは、知りたいと思っていたものを私に示しているからです。結局のところ、各ファイルにどれだけのスペースが必要かを知っているのが好きです。
ジェイクトロント


9

フラットリストの場合、最善の方法は次のとおりです。

find -D tree /fullpath/to-dir/ 

(またはそれをtxtファイルに保存するために)

find -D tree /fullpath/to-dir/ > file.txt

3
Mac OS 10.13.3で試してみました。 find: illegal option -- D
Jayant Bhawal


6

以下は、ディレクトリ名を示す部分的な回答です。

ls -mR * | sed -n 's/://p'

説明:

ls -mR * 「:」で終わる完全なディレクトリ名を一覧表示し、そのディレクトリ内のファイルを個別に一覧表示します

sed -n 's/://p' コロンで終わる行を見つけ、コロンを取り除いて行を出力します

ディレクトリのリストを反復処理することにより、ディレクトリも見つけることができるはずです。まだそれに取り組んでいます。xargsを介してワイルドカードを取得するのは困難です。


素晴らしい答え..まさに私が必要なもの!
セルビン2015年

5

lsディレクトリの最後にワイルドカードを追加すると、完全パスが強制されます。今あなたはこれを持っています:

$ ls /home/dreftymac/
foo.txt
bar.txt
stackoverflow
stackoverflow/alpha.txt
stackoverflow/bravo.txt
stackoverflow/charlie.txt

代わりにこれを行うことができます:

$ ls /home/dreftymac/*
/home/dreftymac/.
/home/dreftymac/foo.txt
/home/dreftymac/bar.txt
/home/dreftymac/stackoverflow:
alpha.txt
bravo.txt
charlie.txt

残念ながら、これは再帰されたディレクトリの完全なパスを出力しないので、あなたが探している完全な解決策ではないかもしれません。


また、残念ながらワイルドカードを使用してlsをsudoすることはできません(ワイルドカードは通常のユーザーとして展開されるため)。
アンドリューlorien

4

答えはたくさんあります。これは私のもので、Macで作業している場合は非常に便利です。

「バンドル」ファイル(.app.rtfd.workflowなど)があることはご存じでしょう。Finderのウィンドウを見ると、それらは単一のファイルのように見えます。しかし、そうではありません。そして、$ lsまたは$ findそれらをディレクトリとして表示します...したがって、それらの内容もリストする必要がない限り、これは私にとってはうまくいきます:

find . -not -name ".*" -not -name "." | egrep -v "\.rtfd/|\.app/|\.lpdf/|\.workflow/"

もちろん、これは作業ディレクトリ用であり、他のバンドルの拡張機能を追加することもできます(ただし、常に/それらの後にあります)。または、バンドルがない場合は他の拡張機能なしで/

.lpdf/」(多言語pdf)はむしろ興味深い。.pdfFinder には通常の " "拡張子(!!)またはなし。このように、あなたはこれのために(またはそれは1つのファイルを数えるだけで)pdfたくさんのものではなく...


4

ls -lR あなたが探していたもの、または少なくとも私はそうでした。乾杯


OPは完全なパスのみを望み、それ以外は何も要求しません。ls -lRその目標を達成しないでしょう。
Hadrien TOMA

3

ディレクトリが相対パスとして渡され、findを呼び出す前に絶対パスに変換する必要がある場合。次の例では、ディレクトリは最初のパラメーターとしてスクリプトに渡されます。

#!/bin/bash

# get absolute path
directory=`cd $1; pwd`
# print out list of files and directories
find $directory

システムでreadlink可能な場合directory=$(readlink -e $1)
通知があるまで一時停止します。

真ですが、cd / pwdの組み合わせはすべてのシステムで機能します。 readlinkOS X 10.5.8では、-eオプションはサポートされていません。
John Keyes、

3
tar cf - $PWD|tar tvf -             

これは低速ですが、再帰的に機能し、ディレクトリとファイルの両方を出力します。他のすべての情報/ディレクトリなしでファイル名が必要な場合は、awk / grepでパイプできます。

tar cf - $PWD|tar tvf -|awk '{print $6}'|grep -v "/$"          

2
単純に使用することもできます:tar cvf / dev / null $ PWD
RuleB

2

@ ghostdog74:ソリューションを少し調整します。
次のコードを使用して、完全な絶対パスでファイルを検索できます。

sudo ls -R / | awk '<br/>
/:$/&&f{s=$0;f=0}<br/>
/:$/&&!f{sub(/:$/,"");s=$0;f=1;next}<br/>
NF&&f{ print s"/"$0 }' | grep [file_to_search]

1

ファイル名は知っていましたが、ディレクトリも必要でした。

$ PWDを見つける| fgrepファイル名

Mac OS 10.12.1で完全に動作しました

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