리디렉션된 파일 목록 출력에서 ​​파일 이름을 무시하는 방법은 무엇입니까?

리디렉션된 파일 목록 출력에서 ​​파일 이름을 무시하는 방법은 무엇입니까?

명령을 사용하여 디렉터리와 해당 하위 디렉터리의 모든 파일을 찾고 출력을 result.txt 파일로 리디렉션하면 result.txt 파일에서 result.txt를 포함한 모든 파일을 얻을 수 있지만 원하지 않았습니다. 결과.txt.

내가 하는 것처럼

find . -type f > allfiles.txt

결과적으로 내가 얻는 것은

./test1/test3/file4
./test1/file3
./test2/test4/file6
./test2/file5
./allfiles.txt

이 상황을 피하는 방법은 무엇입니까?

답변1

구체적으로 find다음과 같이 할 수 있습니다.

find . ! -path ./allfiles.txt -type f > allfiles.txt

보다 일반적으로는 moreutils 명령을 사용하여 명령이 반환될 때까지 출력 파일 생성을 지연할 수 있습니다 sponge.

ls -lRA | sponge allfiles.txt

그러나 이는 전체 출력을 메모리에 저장하는 것을 의미합니다.

moreutils가 설치되지 않은 경우(일반적으로 기본적으로 설치되지 않음) 다음과 같이 구현할 수 있습니다 sponge.

sponge() {
  perl -0777 -e '$text=<STDIN>;
                 open STDOUT, ">", shift or die$!;
                 print $text' -- "$@"
}

답변2

즉, find가 실행되는 동일한 디렉토리에 allfiles.txt 파일을 넣지 마십시오. 다음과 같이 다른 곳에 넣으세요.

find . -type f > /tmp/allfiles.txt

또는 동일한 디렉터리에 있어야 하는 경우 grep을 사용하여 필터링합니다.

find . -type f | grep -vxF ./allfiles.txt > allfiles.txt

(다른 파일이 ./foo\n./allfiles.txt호출되지 않는다고 가정)

관련 정보