Linux CLIで現在のディレクトリからの相対パスでファイルを再帰的に一覧表示する


224

これはこの質問に似ていますが、現在のディレクトリへの相対パスをUNIXに含めたいと思います。次の場合:

ls -LR | grep .txt

フルパスは含まれていません。たとえば、次のディレクトリ構造があります。

test1/file.txt
test2/file1.txt
test2/file2.txt

上記のコードは次を返します:

file.txt
file1.txt
file2.txt

標準のUnixコマンドを使用して、現在のディレクトリからの相対パスを含めるにはどうすればよいですか?


4
これは、lsにこの機能がないことを示しています。
Arjun Singri

1
これらのソリューションのすべてに、findまたはが必要なのは残念ですtree。私が持っているように見えるAndroidデバイスにsshを実行していますがls、これらの他のツールはありません:/
Ponkadoodle

回答:


304

検索を使用:

find . -name \*.txt -print

ほとんどのGNU / Linuxディストリビューションのように、GNU findを使用するシステムでは、-printを省略できます。


11
...そしてそのことについては、「。」を省くことができます
Adam Mitz、

7
絶対パスの場合は、find $(pwd) -name \*.txt
Zags

2
パターンにディレクトリ名の一部がある場合は、の-path "*docs/*.txt"代わりに使用する必要があります-name-wholenameと同じ-path
ダッシュ

9
使用-type fファイルだけではなく、ディレクトリ、シンボリックリンクなどを返すために
ユーザー

2
-name "*.txt"、NOT一致file.TXT-常に使用し-iname "*.txt"、大文字と小文字を区別しないでいる代わりに。
ccpizza 2017年

73

(フルパス)と(インデント行なし)treeでを使用します。-f-i

tree -if --noreport .
tree -if --noreport directory/

次に、を使用grepして、必要なものを除外できます。


コマンドが見つからない場合は、インストールできます。

RHEL / CentOSおよびFedora linuxにツリーコマンドをインストールするには、次のコマンドを入力します。

# yum install tree -y

Debian / Ubuntuを使用している場合、Mint Linuxは端末で次のコマンドを入力します。

$ sudo apt-get install tree -y

2
ファイルのみをリストし、フォルダーを除外する設定はありますか?
thebugfinder 2015年

25

お試しくださいfind。manページで正確に調べることができますが、次のようになります。

find [start directory] -name [what to find]

だからあなたの例のために

find . -name "*.txt"

あなたが望むものをあなたに与えるはずです。



5

それはトリックを行います:

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

しかし、それは、の構文解析で「罪を犯す」ことによって行われlsます。これは、GNUおよびGhostscriptコミュニティでは悪い形式と見なされています。


2
@CAFEBABE:ls一般にバグにつながるため、結果を解析することはタブーと見なされます。問題の文はそれを呼びだそうとしていた。また、私が削除した冗談もありました。
Adam Katz

4
DIR=your_path
find $DIR | sed 's:""$DIR""::'

「sed」はすべての「検索」結果から「your_path」を消去します。そして、あなたは「DIR」パスに相対して受け取ります。


これはまさに私が必要とするものですが、それでも私のために完全なパスを吐き出しますか?
v3nt 2012年

1
アポストロフィを使用しない-find / tmp | sed s: "/ tmp" :: | 詳細
キーレンディクソン

4

findコマンドを使用して目的のファイルの実際のフルパスファイル名を取得するには、それをpwdコマンドで使用します。

find $(pwd) -name \*.txt -print

1

これがPerlスクリプトです:

sub format_lines($)
{
    my $refonlines = shift;
    my @lines = @{$refonlines};
    my $tmppath = "-";

    foreach (@lines)
    {
        next if ($_ =~ /^\s+/);
        if ($_ =~ /(^\w+(\/\w*)*):/)
        {
            $tmppath = $1 if defined $1;    
            next;
        }
        print "$tmppath/$_";
    }
}

sub main()
{
        my @lines = ();

    while (<>) 
    {
        push (@lines, $_);
    }
    format_lines(\@lines);
}

main();

使用法:

ls -LR | perl format_ls-LR.pl

これはひどいPerlプログラムです。おそらく、必要な長さよりも2〜3倍長く、複雑です。
Brad Gilbert

1

シェル関数を作成できます。たとえば、.zshrcまたは.bashrc

filepath() {
    echo $PWD/$1
}

filepath2() {
    for i in $@; do
        echo $PWD/$i
    done
}

最初のものは、単一のファイルでのみ機能します。


1

ルートディレクトリ「/」から検索を開始して、ファイルシステムで「filename」というファイルを見つけます。「ファイル名」

find / -name "filename" 

1

詳細を保持したい場合は、出力にファイルサイズなどのlsが付属しているので、これでうまくいくはずです。

sed "s|<OLDPATH>|<NEWPATH>|g" input_file > output_file

1

貝、あなたは現在のディレクトリ内のものも含めて、再帰的にすべてのpdfファイルを一覧表示するには、この操作を行うことができます。

$ ls **pdf

あらゆる種類のファイルが必要な場合は、「pdf」を削除してください。


0

このような機能を実装するには、
まず、対象のディレクトリを指すlsコマンドを使用します。後でfindコマンドを使用して、結果をフィルターします。あなたの場合、それは次のように聞こえます-常にファイル名は単語で始まります file***.txt

ls /some/path/here | find . -name 'file*.txt'   (* represents some wild card search)

0

mycaseでは、treeコマンドで

相対パス

tree -ifF ./dir | grep -v '^./dir$' | grep -v '.*/$' | grep '\./.*' | while read file; do
  echo $file
done

絶対パス

tree -ifF ./dir | grep -v '^./dir$' | grep -v '.*/$' | grep '\./.*' | while read file; do
  echo $file | sed -e "s|^.|$PWD|g"
done
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.