디렉터리에 많은 텍스트 파일이 있고 디렉터리에 있는 각 파일의 마지막 줄을 삭제하고 싶습니다.
어떻게 해야 합니까?
답변1
GNU가 있다면 이 멋진 oneliner를 사용할 수 있습니다 sed
.
sed -i '$ d' ./*
현재 디렉토리에서 숨겨지지 않은 모든 파일의 마지막 줄을 삭제합니다. -i
GNU의 스위치는 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 1
GNU 와 같은 추가 바이트만 반환 tail
하거나 마지막(올바르게 구분된) 줄과 추가 바이트만 반환합니다.
답변4
더 휴대성이 뛰어난 방법:
for f in ./*
do
test -f "$f" && ed -s "$f" <<\IN
d
w
q
IN
done
나는 이것이 어떤 설명도 필요하지 않다고 생각한다... 이 경우를 제외하고는 아마도 기본적으로 마지막 행을 선택하는 것과 같다 d
. 이는 재귀적으로 검색하지 않으며 숨겨진 파일(일명 도트 파일)도 처리하지 않습니다. 이 항목도 편집하려면 다음을 참조하세요.$d
ed
*를 디렉토리의 숨겨진 파일과 일치시키는 방법