디렉토리에서 모든 파일의 마지막 줄을 제거하는 방법은 무엇입니까?

디렉토리에서 모든 파일의 마지막 줄을 제거하는 방법은 무엇입니까?

디렉터리에 많은 텍스트 파일이 있고 디렉터리에 있는 각 파일의 마지막 줄을 삭제하고 싶습니다.

어떻게 해야 합니까?

답변1

GNU가 있다면 이 멋진 oneliner를 사용할 수 있습니다 sed.

 sed -i '$ d' ./*

현재 디렉토리에서 숨겨지지 않은 모든 파일의 마지막 줄을 삭제합니다. -iGNU의 스위치는 sed제자리에서 작동한다는 의미이며 '$ d'명령은 sed마지막 줄을 삭제합니다( $마지막 줄을 의미, d삭제를 의미).

답변2

다른 대답은 디렉토리에 일반 파일 이외의 내용이나 파일 이름에 공백/줄 바꿈이 있는 파일이 포함된 경우 모두 문제가 있습니다. 어쨌든 작동하는 방법은 다음과 같습니다.

find "$dir" -type f -exec sed -i '$d' '{}' '+'
  • find "$dir" -type f: 디렉토리에서 파일 찾기$dir
    • -type f일반 문서란 무엇입니까?
    • -exec발견된 각 파일에 대해 명령을 실행합니다.
    • sed -i: 파일을 제자리에서 편집합니다.
    • '$d': d마지막( ) $행을 삭제( )합니다.
    • '+': find에 인수를 계속 추가하라고 지시합니다 sed(각 파일에 대해 개별적으로 명령을 실행하는 것보다 더 효율적입니다. @zwol에게 감사드립니다).

-maxdepth 1하위 디렉터리 로 이동하지 않으려면 find.

답변3

GNU를 사용한다는 것은 sed -i '$d'전체 파일을 읽고 마지막 줄 없이 복사본을 만드는 것을 의미하지만, 파일을 직접 자르는 것이 더 효율적입니다(적어도 큰 파일의 경우).

GNU를 사용하면 truncate다음을 수행할 수 있습니다.

for file in ./*; do
  [ -f "$file" ] &&
    length=$(tail -n 1 "$file" | wc -c) &&
    [ "$length" -gt 0 ] &&
    truncate -s "-$length" "$file"
done

파일이 상대적으로 작으면 파일당 여러 명령을 실행하므로 효율성이 떨어질 수 있습니다.

마지막 줄 바꿈(마지막 줄 뒤) 뒤에 추가 바이트가 포함된 파일의 경우, 즉 구분되지 않은 마지막 문자가 있는 경우철사tail, 구현 에 따라 tail -n 1GNU 와 같은 추가 바이트만 반환 tail하거나 마지막(올바르게 구분된) 줄과 추가 바이트만 반환합니다.

답변4

더 휴대성이 뛰어난 방법:

for f in ./*
do
test -f "$f" && ed -s "$f" <<\IN
d
w
q
IN
done

나는 이것이 어떤 설명도 필요하지 않다고 생각한다... 이 경우를 제외하고는 아마도 기본적으로 마지막 행을 선택하는 것과 같다 d. 이는 재귀적으로 검색하지 않으며 숨겨진 파일(일명 도트 파일)도 처리하지 않습니다. 이 항목도 편집하려면 다음을 참조하세요.$ded

*를 디렉토리의 숨겨진 파일과 일치시키는 방법

관련 정보