일부 파일의 이름이 포함된 파일이 있습니다. 목록에 있는 파일의 전체 크기를 알고 싶습니다.
#cat filelist
/tmp-directory/connector_db_ connector_db
/tmp-directory/connector_db -connector_db
/tmp-directory/connector_db_connector_db
보시다시피 파일 이름에는 공백이 포함되어 있습니다.더 나쁜 것은 하이픈(-)입니다.. 다음 명령을 사용하여 이 파일의 전체 크기를 찾으려고 합니다.
#du -sch `cat filelist`
du: invalid option -- 'o'
du: invalid option -- 'n'
du: invalid option -- 'n'
du: invalid option -- 'e'
du: invalid option -- 't'
du: invalid option -- 'o'
du: invalid option -- 'r'
du: invalid option -- '_'
du: invalid maximum depth `b'
아래와 같이 ""를 추가하려고 시도했지만 시도도 실패했습니다.
#cat filelist
"/tmp-directory/connector_db_ connector_db"
"/tmp-directory/connector_db -connector_db"
"/tmp-directory/connector_db_connector_db"
#du -sch `cat filelist`
du: invalid option -- 'o'
du: invalid option -- 'n'
.....
하지만 이건 효과가 있어쉘에서 직접 다음 명령을 사용할 때.
#du -sch "/tmp-directory/connector_db -connector_db"
0 /tmp-directory/connector_db -connector_db
0 total
그렇다면 이러한 상황에 대처하는 방법은 무엇입니까? 나는 가지고있다파일 목록총 3개의 lac 파일이 있습니다. 설상가상으로 "du -sch"는 파일 목록이 20,000개 정도를 초과하면 목록을 처리하지 않습니다. 나는 분할 명령을 사용하여 목록을 20000개의 행으로 분할했습니다.3개의 lac 파일 크기를 쉽게 찾을 수 있는 다른 방법이 있습니까?
답변1
xargs -Ifile du -sch file <filelist
위의 호출 코드는 파일 이름에 개행 문자가 포함되지 않는 한 du -sch
호출됩니다 filelist
. -Ifile
그러면 명령의 문자열이 에서 읽은 각 이름으로 대체됩니다 xargs
.file
du -sch file
filelist
그러면 공백과 쉘 글로빙 패턴이 있는 파일 이름이 올바르게 처리됩니다(패턴은 확장되지 않습니다).
답변2
IFS
명령 대체 주위에 따옴표를 추가하지 않았으므로 여기에서는 값(기본적으로 공백, 탭, 줄 바꿈)을 기반으로 단어 분할이 수행됩니다. 파일 이름에 공백이 있으므로 /tmp-directory/connector_db_ connector_db
두 단어로 분할됩니다( /tmp-directory/connector_db_
예 connector_db
: .
파일 이름을 하나씩 반복할 수 있습니다.
while IFS= read -r file; do du -sch -- "$file"; done <filelist
파일이 크기 때문에 시간이 다소 걸릴 수 있습니다.
또한 파일이 개별적으로 구문 분석되므로 전체 크기가 표시되지 않습니다 du
. 따라서 다음 -s
을 삭제할 수 있습니다 -c
.
while IFS= read -r file; do du -h -- "$file"; done <filelist