bash에서 for 루프 중에 파일 이름에 접미사 추가

bash에서 for 루프 중에 파일 이름에 접미사 추가

이 질문을 받았을 수도 있지만 기존 답변이 이해가 되지 않습니다. 폴더의 여러 CSV 파일에 대해 루프를 실행하고 있습니다. 폴더에는 csv가 아닌 파일도 포함되어 있으므로 csv 파일을 명시적으로 지정해야 합니다. csv 파일을 다양한 방법으로 수정하기 위해 awk, cut 등을 사용하고 있습니다. 완료되면 다음과 같이 이름이 약간 수정된 새 csv 파일로 출력을 리디렉션하고 싶습니다.

TLC_2017.csv > TLC_2017_prepped.csv

이것은 MWE입니다:

for file in TLC*.csv; do
    cut -d, -f2- ${file} > ${file}_prepped
done

문제는 TLC_2017.csv_prepped. 파일 이름에 확장자 대신 접미사를 추가하려면 어떻게 해야 합니까?

기존 질문에 대한 답변으로 문제가 해결되면 해당 질문에 링크만 연결하지 말고 제가 이해할 수 있도록 설명도 제공해 주세요. 감사해요!

답변1

for file in TLC*.csv; do
    cut -d, -f2- "${file}" > "${file%.*}_prepped.csv"
done

${file%.*}이후 모두 삭제마지막point $file. 이후에 모든 것을 삭제하려면첫 번째포인트를 사용하면 %%.

마찬가지로 ${file#*.}( ${file##*.})는 첫 번째(마지막) 지점 이전의 모든 항목을 삭제합니다.

더 읽어보세요매개변수 확장, Bash 매뉴얼.

그리고 기억하세요, 항상변수 참조. 당신은 그것을 사용할 수 있습니다shellcheck스크립트를 디버그하는 데 도움이 됩니다. 인용되지 않은 변수에 대해 경고합니다.


확장자가 다른 파일을 반복하는 경우 대상 파일 확장자를 위와 같이 하드코딩할 수 없으므로 ${file##*.}필요합니다. 최소한의 예로, 빈 테스트 디렉터리에서 시도해 볼 수 있습니다. 그러면 _prepped확장명이 있는 모든 파일에 복사됩니다.

touch A.file.txt B.file.dat C_file.csv D_file.ko E
for file in *.*; do
    noext=${file%.*}
    ext=${file##*.}
    cp "$file" "${noext}_prepped.${ext}"
done

실행 후,

$ ls
A.file_prepped.txt  A.file.txt  B.file.dat  B.file_prepped.dat
C_file.csv  C_file_prepped.csv  D_file.ko  D_file_prepped.ko  E

관련 정보