모든 파일 목록(크기 포함)을 텍스트 파일로 저장하려고 합니다.
이 명령을 사용하면 find *> yourfilename.csv
파일 이름만 내보낼 수 있습니다.
파일 크기를 어떻게 추가하나요?
답변1
bash
Linux(또는 호환 가능한 구현이 포함된 시스템 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
bash
OpenBSD(또는 유사한 구현을 가진 다른 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
.
ls -l > output
output
- 그러면 아래와 같이 파일 내에 디렉터리 목록(크기 포함)이 저장됩니다 .
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 파일로 출력하므로 이를 원하는 구분 기호로 바꿀 수도 있습니다.)