243

これはこの質問に似ていますが、unix で現在のディレクトリからの相対パスを含めたいと考えています。私が次のことをした場合:

ls -LR | grep .txt

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

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

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

file.txt
file1.txt
file2.txt

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

4

14 に答える 14

332

検索を使用:

find . -name \*.txt -print

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

于 2008-10-29T03:34:44.853 に答える
75

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

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

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


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

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

# yum install tree -y

Debian / Ubuntuを使用している場合、MintLinuxはターミナルで次のコマンドを入力します。

$ sudo apt-get install tree -y
于 2010-04-28T00:45:02.277 に答える
25

試してみてくださいfind。マニュアルページで正確に調べることができますが、次のようなものです。

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

あなたの例では

find . -name "*.txt"

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

于 2008-10-29T03:33:53.527 に答える
10

代わりに find を使用できます。

find . -name '*.txt'
于 2008-10-29T03:36:09.733 に答える
5

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

find $(pwd) -name \*.txt -print
于 2011-12-30T05:49:47.030 に答える
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 コミュニティによって悪い形式と見なされている ,の解析で「罪を犯す」ことによって行われます。

于 2016-03-14T21:41:55.333 に答える
4
DIR=your_path
find $DIR | sed 's:""$DIR""::'

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

于 2009-10-15T11:04:31.737 に答える
1

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

filepath() {
    echo $PWD/$1
}

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

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

于 2011-03-30T18:50:16.967 に答える
1

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

sed "s|<OLDPATH>|<NEWPATH>|g" input_file > output_file
于 2013-08-21T14:41:25.307 に答える
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
于 2009-11-27T09:45:37.537 に答える
1

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

find / -name "filename" 
于 2013-02-23T02:11:36.980 に答える