นับไฟล์ในรายการไดเรกทอรี


2

ฉันมีไฟล์พร้อมรายการไดเรกทอรีที่ฉันอยากรู้ว่ามีกี่ไฟล์ในแต่ละไดเรกทอรี

... / images / idsuffix / userids /

นี่จะให้จำนวนไฟล์และไดเรกทอรีสำหรับ 5 ไดเรกทอรีแรกแทนที่จะเป็นสำหรับแต่ละไดเรกทอรี

ค้นหา ./images/00{0..5}/ | ห้องน้ำ

สิ่งที่ฉันต้องการคือการนับเนื้อหาสำหรับแต่ละไดเรกทอรี ฉันพยายามส่งผ่าน xargs แต่ทำสิ่งเดียวกันและสร้างการนับสำหรับไดเรกทอรีทั้งหมด

ls ./images/ > directories.lst  
cat directories.lst | xargs -i{} find {} | wc 

และนี่ไม่ได้สร้างผลลัพธ์ใด ๆ เลย

cat directories.lst | xargs -I{} bash -s "find {} | wc"

คำตอบ:


5

คุณสามารถใช้ for-loop:

for dir in ./images/* ; do echo $dir ; ls "$dir" | wc ; done

ls -aหากคุณต้องการไฟล์จุดที่จะรวมเกินไปใช้

หากคุณต้องการนับไฟล์เป็น dot-dirs ให้ใช้for dir in ./images/* ./images/.*เช่นกัน

หากมีบางไดเรกทอรีที่ไม่ใช่คุณสามารถเพิ่มการทดสอบ:

for dir in ./images/* ; do
    if [[ -d $dir ]] ; then
        echo $dir
        ls "$dir" | wc
    fi
done

การทดสอบไม่จำเป็นถ้าคุณเพิ่มเครื่องหมายสแลชต่อท้าย เช่น./images/*/
grawity

2

หากคุณต้องการอ่านรายการไดเรกทอรีจากไฟล์:

   $ for dir in $(cat directories.lst); do echo "$dir : `ls $dir | wc -l`"; done

อย่างไรก็ตามคุณไม่ต้องการไฟล์:

   $ for dir in $(find images/ -type d); do echo "$dir : `ls $dir | wc -l`"; done

และถ้าคุณต้องการเพียงไดเรกทอรีระดับบนสุด:

   $ for dir in $(find images/ -maxdepth 1 -type d); do echo "$dir : `ls $dir | wc -l`"; done

สุดท้ายถ้าคุณมีช่องว่างในชื่อไฟล์ของคุณ:

   $ SAVEIFS=$IFS; IFS=$(echo -en "\n\b"); for dir in $(find images/ -type d); do echo "$dir : `ls $dir | wc -l`"; done; IFS=SAVEIFS


ลิงค์ที่ดีมาก @grawity ขอบคุณ นั่นคือเหตุผลที่ฉันใช้ IFS ในตัวอย่างสุดท้ายของฉัน ยังมีอีกเหตุผลหนึ่งที่คำตอบของ choroba ดีกว่า :)
terdon

0

การใช้ sh ในส่วน -exec ของคำสั่งคุณสามารถเริ่มเชลล์อื่น ๆ และรันคำสั่งของคุณในนั้นได้ค่อนข้างดี

หา -name "* .dat" -exec csh -c 'echo -n $ 1; grep ID $ 1 | wc -l '{} {} \;

หรือในกรณีของฉันเมื่อนับไฟล์ในไดเรกทอรี ฉันใช้ "ls -f" เนื่องจากมันสร้างเอาต์พุต ls ที่ไม่เรียงลำดับซึ่งเร็วกว่าความพยายามคัดแยกเอาท์พุทออกมาก่อนที่จะทำการนับ

ด้วยการขึ้นบรรทัดใหม่ชื่อ dir และการนับ

find / somedir / some / dir -type d -print -exec sh -c 'ls -f $ 1 / * | wc -l '{} {} \;

ผลลัพธ์มีลักษณะเช่นนี้

/ dir / somedir / 002/1066002
6

ด้วยแท็บระหว่างชื่อ dir และนับ

ค้นหา / somedir / บางส่วน / dir -type d -exec bash -c 'echo -en "$ 1 \ t"; ls -f $ 1 / * | wc -l '{} {} \;

ผลลัพธ์มีลักษณะเช่นนี้

/ dir / somedir / 002/1066002 6

http://www.compuspec.net/reference/os/solaris/find/find_and_execute_with_pipe.shtml


ผมไม่คิดว่าคุณจะต้องผ่านผลการค้นหาเป็นครั้งที่สองตั้งแต่คุณเข้าถึงเท่านั้น{} $1
Daniel Beck

@DanielBeck ที่มีออกมาที่สอง {} ปริมาณการส่งออกไม่ได้รวมถึงชื่อไดเรกทอรีและจะแสดงเฉพาะนับไดเรกทอรีที่
nelaaro
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.