파일 이름의 일부와 폴더에 있는 모든 파일의 파일 경로가 파일당 한 줄씩 포함된 txt 파일을 출력하려면 어떻게 해야 합니까?

파일 이름의 일부와 폴더에 있는 모든 파일의 파일 경로가 파일당 한 줄씩 포함된 txt 파일을 출력하려면 어떻게 해야 합니까?

다음 파일이 있습니다

/folder/abc1.txt.gz
/folder/abc2.txt.gz
/folder/abc3.txt.gz

다음 내용으로 txt 파일을 만들고 싶습니다.

abc1 /folder/abc1.txt.gz
abc2 /folder/abc2.txt.gz
abc3 /folder/abc3.txt.gz

다음 명령을 사용했습니다.

find /folder -name 'abc*.txt.gz' -type f -printf '%f %p\n' > out.txt

그러면 다음이 출력됩니다.

abc1.txt.gz /folder/abc1.txt.gz
abc2.txt.gz /folder/abc2.txt.gz
abc3.txt.gz /folder/abc3.txt.gz

파일 이름의 첫 번째 부분(.txt.gz 제외)과 경로만 가질 수 있는 방법은 무엇입니까?

답변1

항상 동일한 확장명인 경우 다음 방법으로 제거할 수 있습니다.

find /folder -name 'abc*.txt.gz' -type f -printf '%f %p\n' |sed 's/\.txt.gz//'

sed명령은 첫 번째 항목만 삭제합니다 .txt.gz.

확장 프로그램을 제거하려면:

find /folder -name 'abc*.txt.gz' -type f -printf '%f %p\n' |sed 's/\.[^[:space:]]* / /'

확장 자체에 공백이 없다고 가정하면 첫 번째 점 뒤부터 .첫 번째 공백까지 공백이 아닌 모든 문자가 제거됩니다.

답변2

을 사용하여 솔루션을 찾고 있고 접미사가 파일 세트 전체에서 일정하다고 basename가정할 수 있고 다음 을 사용하고 있으므로 다음을 사용합니다 ..txt.gzbash

declare -a files

readarray -t files < <( find /folder -name '*.txt.gz' -type f )

for f in "${files[@]}"
do
        printf '%s %s\n' "$(basename "$f" '.txt.gz')" "$f"
done

$ test.sh
abc1 /folder/abc1.txt.gz
abc2 /folder/abc2.txt.gz
abc3 /folder/abc3.txt.gz

답변3

쉘 배쉬의 경우:

find folder/ -name 'abc*.txt.gz' -exec bash -c ': ${0##*/}; echo ${_%%.*} $0' {} \;

:빈 명령이지만 해당 인수는 ${0##*/}내부 $_변수(이전 단순 명령의 마지막 매개변수).

답변4

basename를 사용하여 파일에서 디렉토리 경로와 접미사를 제거한 다음 를 사용 -print하여 전체 경로 이름을 인쇄하고 두 가지를 결합하십시오 paste.

find /folder -name 'abc*.txt.gz' -type f -exec basename {} .txt.gz \; -print |
paste - -

이렇게 하면 탭으로 구분된 두 개의 열이 있는 출력 줄이 생성됩니다. 여기서 첫 번째 열은 찾은 파일의 출력 basename이고 두 번째 열은 찾은 파일의 전체 경로 이름입니다. 구분 기호로 공백을 원하면 를 paste -d ' ' - -사용하십시오 paste - -.

이는 삽입된 개행 문자가 포함되지 않은 이름에 의존하며, 사용된 구분 기호가 포함된 이름은 paste구문 분석하기 어려운 목록이 될 수도 있습니다.

관련 정보