ls 출력을 변수에 할당하면 예기치 않은 동작이 발생합니다.

ls 출력을 변수에 할당하면 예기치 않은 동작이 발생합니다.

저는 디렉토리의 텍스트 파일을 정리하는 스크립트를 작성 중입니다. (나쁜 생각이라는 것은 알지만 꼭 필요합니다.) 다음과 같이 작성했습니다.

#!/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

관련 정보