Linux CLI에서 현재 디렉토리에 상대적인 경로를 사용하여 파일을 재귀 적으로 나열


224

이것은 이 질문 과 비슷 하지만 유닉스의 현재 디렉토리에 상대적인 경로를 포함하고 싶습니다. 내가 다음을 수행하면 :

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
그것은 이러한 솔루션의 모든 필요한 수치 findtree. 나는 내가 가지고있는 것처럼 보이는 안드로이드 장치에 ssh'ing하고 있으며 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
dashesy

9
-type f디렉토리, 기호 링크 등이 아닌 파일 만 리턴하는 데 사용
사용자

2
-name "*.txt"것입니다 NOT 일치 file.TXT- 항상 사용 -iname "*.txt"대소 문자를 구분하는 대신.
ccpizza

73

(전체 경로) 및 (들여 쓰기 라인 없음 )과 tree함께를 사용하십시오 .-f-i

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

그런 다음을 사용 grep하여 원하는 것을 필터링 할 수 있습니다 .


명령이 없으면 설치할 수 있습니다.

RHEL / CentOS 및 Fedora linux에 tree 명령을 설치하려면 다음 명령을 입력하십시오.

# yum install tree -y

Debian / Ubuntu를 사용하는 경우 터미널에서 Mint Linux 유형 다음 명령을 입력하십시오.

$ sudo apt-get install tree -y

2
파일 만 나열하고 폴더를 제외시키는 설정은 무엇입니까?
thebugfinder

25

시도하십시오 find. 맨 페이지에서 정확하게 찾을 수 있지만 다음과 같습니다.

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"

그러나 lsGNU와 Ghostscript 커뮤니티에서 나쁜 형식으로 간주되는 구문 분석을 통해 "죄닝" 함으로써 그렇게합니다.


2
@CAFEBABE : ls일반적으로 버그 가 발생 하기 때문에 결과를 구문 분석하는 것은 금기 사항으로 간주됩니다 . 문제의 문장은 그것을 불러 내려고했다. 내가 제거 한 농담도있었습니다.
Adam Katz

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

'sed'는 모든 'find'결과에서 'your_path'를 지 웁니다. 그리고 당신은 'DIR'경로와 관련하여받습니다.


이것은 내가 필요로하는 것이지만 여전히 나를 위해 전체 경로를 내뱉습니까?
v3nt

1
아포스트로피를 사용하지 마십시오-find / tmp | sed s : "/ tmp":: | 더
Kieren Dixon

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 배 길고 복잡 할 것입니다.
브래드 길버트

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 -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.