내가 원하는 것은 디렉토리를 반복하고 하위 디렉토리에 대한 정보를 매우 특정한 형식으로 출력하여 사용자에게 적합하고 나중에 awk
, 및 grep
와 같은 도구를 사용하여 구문 분석할 수도 있도록 하는 것입니다 sed
.
이는 bash 스크립트의 함수 내에서 실행되고 사용자 터미널에 인쇄됩니다. 유언장 과 비슷 ls
하지만 특정 열, 순서 및 필드가 있습니다. 그 위에 함수를 다시 실행하고 awk
관심 있는 디렉터리만 캡처하는 등의 작업으로 파이프한 다음 diff
해당 디렉터리에 대해 다른 작업을 실행하겠습니다.
~/Parent/2017
Directory Name Size Last Modified Number of Files
2017-08-25 1.9 GB Aug 30 16:39 141
2017-08-26 152 MB Aug 27 12:57 48
2017-08-29 5.9 GB Aug 30 7:19 462
2017-08-30 102 MB Sep 2 14:36 20
2017-08-31 2.0 GB Sep 1 9:18 148
2017-09-01 1.2 GB Sep 5 10:21 89
내 Parent
디렉토리가 다음과 같을 때
> ls -l ~/Parent/
2015
2016
2017
Backups
Catalog-file.data
'Temporary Folder DE2B14BB-1052-4FF0-B4E7-B94C0E3CC6F8'
backup-logs
rsync.log
지금까지 나는 이런 것을 가지고 있습니다
IFS=$'\n';
for d in `find -maxdepth 1 -type d | grep -P "\d{4}" | grep -v -P "[a-z]+"`; do
for sd in `find ${d} -maxdepth 1 -type d`; do
file_count=`ls -lh ${sd} | wc -l`
done
ls -lh ${d} | awk -v fc="$file_count" '{printf "%-13s %-8s %-5s %-5s %-8s %-8s \n", $8, $4, $5, $6, $7, fc}'
done
나는 그것이 제대로 작동하지 않는다는 것을 알고 있습니다. 방금 지금까지 가지고 있는 코드를 제공했는데 당황스럽습니다. file_count
각 출력 라인에 대해 변수()를 저장하는 방법은 무엇입니까 awk
? 참고: ls
"크기" 열을 변수로 바꾸 려면 이 정보가 필요할 수 있습니다 .du -sh directory_name
일반적으로 문제를 계속 해결해 나갈 수 있습니다. 하지만 그 지점에 도달했을 때 아마도 어려운 방법으로 해냈을 수도 있고 더 쉬운 방법이 있을 수도 있다고 생각했습니다. 어떻게 생각하나요? 그러한 사이클이 두 개 있습니까? 아니면 더 쉬운 방법이 있나요?
답변1
GNU 도구를 사용하면 다음을 수행할 수 있습니다.
find . \( -path './*/*' -o -type d \) -printf '%TF %TH:%TM/%s/%p\0' |
gawk -F/ -v 'RS=\0' '
BEGIN{split("K/M/G/T/P/E/Z/Y", u)}
function h(n, i) {
while (n >= 1024) {n /= 1024; i++}
return sprintf("%.4g%s", n, u[i])
}
{s[$4] += $2; n[$4]++}
NF == 4 {t[$4] = $1}
END{
PROCINFO["sorted_in"] = "@ind_str_asc"
for (d in t) printf "%-13s %-8s %s %s\n", d, h(s[d]), t[d], n[d]
}'
즉, 수량과 누적을 계산하는 것입니다.확실히반복적으로 디렉터리에 있는 모든 파일의 크기(디스크 사용량 아님)(더 깊은 파일을 고려하지 않으려면 하나 추가) -maxdepth 2
. find
디스크 사용량의 경우 블록 수를 계산하고 하드링크를 한 번만 계산하면 더 복잡해집니다.
답변2
스크립트의 특정 부분에 대한 find
GNU 명령의 작동에 익숙하십니까 -printf
? 현재 수행 중인 작업에 따라 파일 정보 표시를 맞춤화할 수 있습니다. 파일 검색과 표시를 모두 수행하면 스크립트를 단순화할 수 있습니다.
이 명령의 유연성을 설명하려면 다음을 수행하십시오.
find -name '*.sh' -printf 'Script %P last accessed on %D at %r. Owned by %u with permissions set to %M'
...비슷한 결과...
Script foo.sh last accessed on 03/01/17 at 10:15 PM. Owned by joe.blow with permissions set to -rwx-r-x-r-x
Script bar.sh last accessed on 03/22/17 at 02:42 AM. Owned by joe.blow with permissions set to -rw--r---r--
생각할 수 있는 거의 모든 파일 속성에 대해 약 30가지의 서로 다른 지시어가 있으며 날짜 형식은 이를 기반으로 하므로 strftime
매우 강력하고 유연합니다. 이러한 플래그에는 왼쪽/오른쪽 정렬, 최소 숫자 너비 등과 같은 일반적인 수정자도 있습니다.