각 파일의 크기와 함께 텍스트 파일 목록에 저장됩니다.

각 파일의 크기와 함께 텍스트 파일 목록에 저장됩니다.

모든 파일 목록(크기 포함)을 텍스트 파일로 저장하려고 합니다.

이 명령을 사용하면 find *> yourfilename.csv파일 이름만 내보낼 수 있습니다.

파일 크기를 어떻게 추가하나요?

답변1

bashLinux(또는 호환 가능한 구현이 포함된 시스템 stat) 에서 셸 사용 :

shopt -s globstar dotglob nullglob

for pathname in ./**/*; do
    if [[ -f $pathname ]] && [[ ! -h $pathname ]]; then
        stat -c $'%s\t%n' "$pathname"
    fi
done >outfile.csv

bashOpenBSD(또는 유사한 구현을 가진 다른 BSD 시스템 stat) 의 경우 다음을 사용합니다.

shopt -s globstar dotglob nullglob

for pathname in ./**/*; do
    if [[ -f $pathname ]] && [[ ! -h $pathname ]]; then
        stat -f '%z%t%N' "$pathname"
    fi
done >outfile.csv

이 두 가지 모두 현재 디렉터리 안이나 아래의 모든 이름을 반복합니다. 각 일반 파일에 대해 stat파일 크기를 바이트 단위로 호출하여 표시하고 사이에 탭이 있는 파일 경로 이름을 인쇄합니다.


쉘만 zsh사용 :

zmodload -F zsh/stat b:zstat
zstat -n +size ./**/*(D.)

이렇게 하면 내장 zstat명령을 셸에서 사용할 수 있으며, 현재 디렉터리 안이나 아래에 있는 모든 일반 파일(숨겨진 이름이 있는 파일 포함)의 경로 이름과 겉보기 파일 크기(바이트)를 가져오는 데 사용할 수 있습니다.

몇 개의 작은 파일만 포함된 얕은 디렉터리의 경우 출력은 다음과 같습니다.

./file1 136
./file2 136
./somedir/file3 136

...그래서 CSV와는 별로 다릅니다.

이 작업은 간단한 루프에서도 수행할 수 있으며 이를 통해 보다 정확하게 형식을 지정할 수 있습니다.

zstat -L -A data -n +size ./**/*(D.)
for name size in $data; do
    printf '%s\t%s\n' $size $name
done >outfile.csv

이는 현재 디렉터리 안이나 아래에 있는 모든 일반 파일을 호출하고 zstat결과를 배열에 저장한 data다음 해당 배열의 항목(경로 이름과 파일 크기가 번갈아 변경됨)을 반복합니다. 각 경로 이름/크기 쌍에 대해 크기(바이트 단위)를 먼저 인쇄한 다음 탭과 경로 이름을 인쇄합니다. 여기서 출력은 outfile.csv현재 디렉터리에 배치됩니다.

루프를 제거하지만 보다 모호한 코드로 비용을 지불하는 단축 버전입니다( printf형식 문자열에 익숙하지 않은 경우).

zstat -L -A data -n +size ./**/*(D.)
printf '%2$s\t%1$s\n' $data >outfile.csv

형식 printf%2$s\t%1$s\n두 매개변수가 문자열로 출력되어야 하지만 data그 사이에 탭 문자를 사용하여 반대 순서(배열은 경로 이름과 파일 크기 쌍을 해당 순서로 저장함)로 출력해야 함을 지정합니다. data배열이 모두 소모될 때까지 각 경로 이름 및 파일 크기 쌍에 대해 형식이 반복됩니다 .


위 변형 중 어느 것도 탭 또는 개행 문자를 포함하는 CSV 참조 경로 이름을 고려하지 않습니다.

답변2

CSV 파일을 쉼표로 구분하고 모든 파일 이름에 큰따옴표, 쉼표 또는 개행 문자를 포함하지 않으려고 GNU 구현을 사용하여 다음을 find시도해 보십시오.

find -printf "%p,%s\n" >filename.csv

답변3

이는 다음을 사용하여 수행할 수 있습니다 ls.

  1. ls -l > outputoutput- 그러면 아래와 같이 파일 내에 디렉터리 목록(크기 포함)이 저장됩니다 .
total 4
-rw-r--r-- 1 ashleyprimo ashleyprimo 124 Jan  4 20:01 test1
-rw-r--r-- 1 ashleyprimo ashleyprimo   0 Jan  4 19:56 test2
-rw-r--r-- 1 ashleyprimo ashleyprimo   0 Jan  4 19:56 test3
-rw-r--r-- 1 ashleyprimo ashleyprimo   0 Jan  4 19:56 test5

-a포함 숨겨진 파일(예: . 앞에 오는 파일)을 추가할 수 있으며 -h크기 출력을 "사람이 읽을 수 있도록" 만들 수 있습니다. (예: 위에 표시된 바이트 대신 MB, GB 등으로 표시됨)

현재 디렉터리에 있는 파일의 간단한 크기 출력을 원하는 경우 다음을 사용할 수 있습니다. ls -lh | grep -vE "total|\." | awk {'print $5 " " $9'} > output다음과 같이 출력됩니다.

124 test1
0 test2
0 test3
0 test5

답변4

-ls찾기 옵션을 사용할 수 있습니다 .

find /dir -ls >filename.csv

그러나 이렇게 하면 파일 이름과 크기보다 더 많은 정보가 인쇄됩니다.

또는 다음 find을 조합하여 사용할 수 있습니다 stat.

find /dir -exec printf '%s,' {} \; -exec stat -f %z {} \; >filename.csv

그러면 파일 이름과 크기가 쉼표로 구분되어 바이트 단위로 인쇄됩니다. (csv 파일로 출력하므로 이를 원하는 구분 기호로 바꿀 수도 있습니다.)

관련 정보