저는 디렉토리의 텍스트 파일을 정리하는 스크립트를 작성 중입니다. (나쁜 생각이라는 것은 알지만 꼭 필요합니다.) 다음과 같이 작성했습니다.
#!/bin/bash
var=$(ls -p /direcotry/to/file | grep -v /)
truncate -s 0 $var
문제는 스크립트를 실행할 때 해당 디렉터리의 모든 파일이 스크립트를 시작한 디렉터리에 복사되고 원래 디렉터리의 파일은 변경되지 않은 상태로 유지된다는 것입니다. 이 동작이 발생하는 이유와 해결 방법은 무엇입니까?
답변1
이는 명령의 출력이 ls
경로가 아닌 파일 이름 목록이기 때문입니다. 따라서 이 truncate
명령은 현재 디렉터리의 빈 파일과 동일한 파일 이름을 다시 만듭니다.
또한 올바르게 수행되더라도 더 복잡한 파일 이름(줄 바꿈 또는 백슬래시 등 포함)은 말할 것도 없고 약간 이상한 파일 이름(예: 공백 포함)에서는 접근 방식이 중단됩니다.
첫째, 스크립트를 작성할 필요가 없습니다. 파일 목록을 다음으로 전달할 수 있습니다 truncate
.
truncate -s 0 /direcotry/to/*
디렉터리가 발견 되면 truncate
오류만 인쇄하고 다음 항목으로 이동합니다.
truncate: cannot open ‘foo’ for writing: Is a directory
이 작업을 보다 깔끔하게 수행하려면 다음을 사용할 수 있습니다 find
.
find /direcotry/to/file -type f -exec truncate -s {} +
또는 쉘 글로브:
for f in /direcotry/to/file; do
[ -f "$f" ] && truncate -s "$f"
done