각 파일의 줄 수와 날짜를 표시하여 파일을 나열하고 싶습니다. 을 사용하여 행복하게 행 수를 얻을 수 있습니다 wc -l *
. 문제가 아니다. 을 사용하여 날짜를 얻을 수 있습니다 ls -l
.
이 두 명령을 결합하여 열에 단일 출력을 제공하는 방법이 있습니까?
답변1
이것은 find
+ + 가 wc
있는 것 입니다 date
.
find . -maxdepth 1 -exec sh -c '[ -f "$0" ] && \
printf "%6s\t\t%s\t%s\n" "$(wc -l<"$0")" "$(date -r "$0")" "$0"' {} \;
date -r
예를 들어 대안 중 하나를 사용하는 것도 가능합니다 stat -c%y
.
출력은 다음과 같습니다.
394 Thu Oct 16 22:38:14 UTC 2014 ./.zshrc
7 Thu Oct 30 11:19:01 UTC 2014 ./tmp.txt
2 Thu Oct 30 06:02:00 UTC 2014 ./tmp2.txt
40 Thu Oct 30 04:16:30 UTC 2014 ./pp.txt
이것을 시작점으로 사용하여 디렉터리와 모드를 매개 변수로 받아들이는 함수를 만들 수 있습니다.
myls () { find "$1" -maxdepth 1 -name "$2" -exec sh -c '[ -f "$0" ] && \
printf "%6s \t\t%s\t%s\n" "$(wc -l<"$0")" "$(date -r "$0")" "$0"' {} \;; }
그러면 myls /tmp '*.png'
의 이미지만 나열됩니다 /tmp
(쉘이 전역 연산자를 확장하는 것을 방지하기 위해 패턴 주위에 작은따옴표를 참고하세요 *
).
답변2
기반 솔루션이 find
가장 우아해 보이지만 재미삼아 이 문제를 해결하는 다른 방법이 있습니다.
이는 출력을 sed
& 정리한 다음 파일 이름을 조인 필드로 사용하여 출력에 결합합니다 .head
wc
join
stat
pat="A*";join -1 2 -2 1 -t ' ' <(wc -l $pat|head -n-1|sed 's/^[ ]*//') <(stat -c '%n %y' $pat) | awk '{printf "%-20s %6s %s %s %s\n",$1,$2,$3,$4,$5}'
을 사용하여 열을 다시 정렬하고 파일 이름이 일치하는지 확인하는 paste
더 쉬운 방법도 있습니다 .awk
pat="A*";paste -d ' ' <(wc -l $pat) <(stat -c '%n %y' $pat) | awk '$2==$3{printf "%6s %s %s %s\n", $1, $4, $5, $2}'
그러나 만약 이름이아니요일치(이 명령을 실행하면 파일 목록이 변경됨)하면 오류가 표시되지 않습니다. 하지만 이 버전에서는 오류가 보고됩니다.
pat="A*";paste -d ' ' <(wc -l $pat) <(stat -c '%n %y' $pat) | awk '$2==$3{printf "%6s %s %s %s\n", $1, $4, $5, $2;next};{print "Error:" $0}'
물론 마지막 줄에 오류 메시지가 인쇄되지만 수정하기 쉽습니다. 아니면 무시하세요. :)
답변3
내가 사용하는 것은 awk
아래와 같습니다.
wc -l * | head --lines=-1 | while read num file
do
echo -n $num" "
ls -l $file | awk '{
for (i=6; i <= NF; i++)
printf $i " "
}'
echo
done
head
마지막 행(wc
출력의 총 행)을 삭제하는 데 사용됩니다.num
포함된 행 수입니다file
.awk
인쇄를 위한ls -l
시간 출력 .
답변4
무엇에 대해:
ls -lrth yourfile|awk '{print $6 $7 " " $8 system("wc -l " $9) }' | tr '\n' ' '