답변:
for file in /foo/*
do
if [ -f "$file" ]
then
dd if="$file" of="$file.truncated" bs=31 skip=1 && mv "$file.truncated" "$file"
fi
done
또는 Gilles의 제안 덕분에 더 빠릅니다.
for file in /foo/*
do
if [ -f $file ]
then
tail +32c $file > $file.truncated && mv $file.truncated $file
fi
done
참고 : Posix tail은 "+ 32c"대신 "-c +32"를 지정하지만 Solaris 기본 꼬리는 마음에 들지 않습니다.
$ /usr/bin/tail -c +32 /tmp/foo > /tmp/foo1
tail: cannot open input
/usr/xpg4/bin/tail
두 구문 모두에 좋습니다.
dd
여기에 제안하는 것은 과잉 tail
이며 더 적절합니다 (더 간단하고 킬러 오타의 위험이 적으며 stderr에 가짜 메시지가 없음).
cut
(꼬리가 아니어야합니까? ... 그대로, 그것은 나를 위해 작동하지 않습니다 ...
/usr/xpg4/bin
앞서 나가야 /usr/bin
합니다 PATH
. 그렇지 않으면 1990 년대 초에 갇힐 것입니다. 많은 유니스 (예 : GNU, BusyBox)는 더 이상 히스토리 +32c
구문을 지원하지 않으며 +32c
POSIX에서 요구 하는 파일을 의미합니다 .
tail -c +32
입력에서 첫 31 바이트를 뺀 값을 출력합니다. (예, 인수는 하나씩 해제됩니다.) 파일을 제자리에서 편집하려면, 스폰지 를 반복해서 사용 하거나, 가지고 있지 않고 신경 쓰지 않으려면 쉘에서 해당 작업을 수행하십시오.
for x in /foo/*; do tail -c +32 "$x" | sponge "$x"; done
for x in /foo/*; do tail -c +32 "$x" >"$x.new" && mv "$x.new" "$x"; done
어떤 이유로 든 명령이 중단 된 경우 (예 : 정전) 중단 한 위치를 파악하기 어려울 수 있습니다. 새 파일을 별도의 디렉토리에 쓰면 작업이 쉬워집니다.
mkdir /foo.tmp
cd /foo
for x in *; do tail -c +42 -- "$x" >"/foo.tmp/$x" && rm -- "$x"; done
mv /foo.tmp/* /foo
rmdir /foo.tmp
파일이 실제로 큰 경우 (하나의 파일이라도 두 개의 사본을 보유 할 수있을 정도로 큰 경우) 이 스레드에서 언급 한 기술 중 하나를 사용할 수 있습니다 .