다음 파일이 있습니다
/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.gz
bash
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
구문 분석하기 어려운 목록이 될 수도 있습니다.