각 파일의 첫 번째 문자만 삭제하는 Linux 명령이 있습니까?

각 파일의 첫 번째 문자만 삭제하는 Linux 명령이 있습니까?

폴더에 있는 모든 파일의 첫 번째 줄의 첫 문자를 삭제한 다음 저장할 수 있는 Linux 명령이 있습니까?

많은 온라인 리소스에서는 첫 번째 줄 대신 파일 이름의 모든 줄에 대해 이 작업을 수행합니다. 그렇지 않으면 파일이 저장되지 않습니다. 원하는 대로 명령 중 하나를 수정하려고 시도했지만 실제로는 파일이 비어 있었습니다.

답변1

현재 작업 디렉터리 안이나 아래에 있는 비어 있지 않은 모든 일반 파일의 첫 번째 문자를 제거하려면 셸에서 zsh다음을 수행할 수 있습니다.

zmodload zsh/mapfile
for file (**/*(ND.L+0)) mapfile[$file]=${mapfile[$file]#?}

완전 똑같지는 않으니 참고하세요첫 번째 줄의 첫 번째 문자 삭제첫 번째 줄이 비어 있는 특수한 경우(파일은 개행 문자로 시작됩니다). 이 경우 위의 내용은 줄바꿈을 제거합니다. 즉, 첫 번째(빈) 줄이 제거됩니다. 이 작업을 원하지 않는 경우 ?(모든 문자 일치)를 [^$'\n']개행 문자를 제외한 모든 문자 일치로 바꿀 수 있습니다.

매우 큰 파일에서는 이 작업을 수행하지 않는 것이 좋습니다. 이렇게 하면 결국 전체 파일이 메모리에 로드되기 때문입니다.

sed -i보다 메모리 친화적인 접근 방식이지만 파일을 수정된 복사본으로 바꾸는 대신 원본 파일을 다시 작성하고 모든 메타데이터를 유지하는 방법은 다음과 같습니다.

find . -name '*.jpg' -size +0 -exec ksh93 -c '
  builtin cat
  for file do
    { IFS= read -rN1 && cat; } < "$file" 1<>; "$file"
  done' ksh93 {} +

이번에는 ksh93<>;리디렉션 연산자를 사용하여 읽기+쓰기 모드에서 파일을 열고(처음에는 잘림 없이) 리디렉션 명령이 성공할 경우에만 종료 시 파일을 자릅니다. 여기서 command는 명령 그룹입니다.하나stdin의 문자를 삭제하고 stdin의 나머지 부분을 stdout에 씁니다.

파일 이름의 나머지 부분이 현재 로케일의 문자로 디코딩될 수 있는 경우 GNU find(및 반대로 zsh)는 이름이 로 끝나는 파일을 찾지 않는다는 점에 유의하십시오..jpg


또는 로캘 문자 인코딩의 문자로 디코딩할 수 없는 콘텐츠로 시작하는 파일의 첫 번째 바이트입니다. sed '1s/.//'디코딩할 수 있는 첫 번째 문자를 제거하므로 파일 시작 부분에서 반드시 그럴 필요는 없으며, sed '1s/^.//'첫 번째 줄의 시작 부분에 있는 첫 번째 문자만 제거하고 다른 작업은 수행하지 않는 것과 비교해 보세요.

답변2

당신이 가지고 있다면 GNU sed:

find PATH -type f -exec sed -s -i '1s/.//' \{} +

답변3

파일이 포함된 폴더에서 awk 루프로 시작하고 출력 문자열을 원본 파일로 즉시 리디렉션할 수 있습니다. 처음 n자를 삭제하는 데 사용할 수 있는 awk 명령은 다음과 같습니다.

awk '{print substr($1,2) > "/output/file" }' /path/to/file

읽은 것과 동일한 파일에 쓰는 것이 최선의 방법은 아니지만 작동한다는 점을 명심하십시오.

관련 정보