Score:6

คำสั่ง `find` ของฉันในสคริปต์ไม่พบไฟล์และไดเร็กทอรีที่มีช่องว่างในชื่อ

ธง pr

เมื่อไม่นานมานี้ ฉันได้เขียนสคริปต์ที่ย้ายไฟล์และไดเร็กทอรีจาก ดาวน์โหลด ถึง .ดาวน์โหลด หากมีอายุมากกว่า 3 วัน และลบออกจากไดเร็กทอรีนี้หลังจาก 30 วัน มันใช้งานได้ดี แต่สำหรับไฟล์ที่ไม่มีช่องว่างเท่านั้น

ข้าพเจ้าตรวจสอบแล้วพบว่า หา คำสั่งที่ฉันใช้ในสคริปต์ไม่ทำงานอย่างที่ฉันคาดไว้สำหรับไฟล์หรือไดเร็กทอรีใด ๆ ที่มีช่องว่างในชื่อ

นี่คือสิ่งที่ หา ทำ:

ค้นหาเอาต์พุตคำสั่ง

ฉันคาดว่าจะเห็น หา คำสั่งค้นหาไฟล์ที่มีช่องว่างด้วย

นี่คือสคริปต์:

#! /ถัง/ทุบตี
# ชุด -x
ส่งออก DISPLAY=:0.0

# จริง - ลบ, อื่น ๆ - ย้าย
กระบวนการทำงาน (){
    ถ้า [ "$2" = "ลบ" ]; แล้ว
        rm -r "$1" && แจ้ง-ส่ง "ลบ $3 $1 แล้ว!"
    อื่น
    mv "$1" "../.Downloads/$1" && แจ้ง-ส่ง "$3 $1 ย้ายไปที่ ~/.Downloads/$1!"
    ไฟ
}

# ลบไดเรกทอรีที่ว่างเปล่า
สำหรับ EmptyDir ใน `find ~/Desktop/ ~/Downloads/ -empty -type d`; ทำ
    แจ้งส่ง "Directoy $emptyDir ถูกลบเพราะว่างเปล่า!"
เสร็จแล้ว
ค้นหา ~/Desktop/ ~/Downloads/ -empty -type d -delete

# ลบ / ย้ายไฟล์ / ไดเร็กทอรีเก่า
ถ้า [ -z "$1" ] || [ "${1,,}" != "ลบ" ] && [ "${1,,}" != "ย้าย" ]; แล้ว
    echo "ให้เป็นโหมดพารามิเตอร์ ( ลบ / ย้าย )"
    ทางออก
ไฟ

ถ้า [ "${1,,}" == "ลบ" ]; แล้ว
    วัน=30
    เส้นทาง = "ดาวน์โหลด"
    โหมด = "ลบ"
อื่น
    วัน=2
    เส้นทาง = "ดาวน์โหลด"
    โหมด = "ย้าย"
  Cr  
  ถ้า [ ! -d "~/.ดาวน์โหลด" ]; แล้ว
    mkdir -p ~/.ดาวน์โหลด
  ไฟ
ไฟ

ซีดี ~/$ เส้นทาง

สำหรับองค์ประกอบใน *
ทำ
    ถ้า [ -d "$element" ]; แล้ว
        ถ้า [ $(find "$element" -type f -mtime -$day | wc -l) -eq 0 ]; แล้ว
            ประมวลผล "$ element" "$mode" "Directory"
        ไฟ
    อื่น
        ถ้า [ $(find `pwd` -name "$element" -mtime +$day | wc -l) -gt 0 ]; แล้ว
            ประมวลผล "$ element" "$mode" "ไฟล์"
        ไฟ
    ไฟ
เสร็จแล้ว

ฉันขอให้คุณบอกฉันว่าฉันอาจทำอะไรผิด

ขอบคุณล่วงหน้า!

GammaGames avatar
in flag
คุณสามารถใส่อะไรง่ายๆ เช่น `@reboot [ชื่อผู้ใช้] find ~/Downloads/ -mtime +3 -exec gio Trash {} \;` ใน crontab ของคุณ distro ของฉันถูกตั้งค่าให้ล้างไฟล์ขยะหลังจาก 30 วัน แต่สามารถทำได้ด้วยตนเองด้วยแพ็คเกจ `trash-cli`
Score:13
ธง hr

tl;dr: ไม่ใช่ช่องว่าง แต่เป็นวงเล็บ1

เดอะ หา คำสั่ง -ชื่อ การทดสอบใช้การแสดงออกของเชลล์โกลบอล - การเพิ่มเครื่องหมายคำพูดรอบอาร์กิวเมนต์จะป้องกันไม่ให้อักขระพิเศษของโกลบอลถูกตีความโดยคุณ เปลือก, แต่ หา ยังคงต้องการให้พวกเขาหลบหนี

อดีต.

$ touch 'ชื่อไฟล์ที่มี [วงเล็บ] อยู่ในนั้น'
$ หา. -name 'ชื่อไฟล์ที่มี [วงเล็บ] อยู่ในนั้น'
$

(ไม่มีผลลัพธ์ - เพราะ [วงเล็บ] หมายถึงอักขระใด ๆ ในชุด , , , , เค, อี, ที, ); ในทางตรงกันข้าม

$ หา. -name 'ชื่อไฟล์ที่มี \[วงเล็บ\] อยู่ในนั้น'
./filename ที่มี [วงเล็บ] อยู่ในนั้น

หากคุณจำเป็นต้องนำสิ่งนี้ไปใช้แบบเป็นโปรแกรม คุณอาจใช้ bash shell's พิมพ์ฉ ในการเพิ่ม Escape ที่จำเป็น:

$ element='ชื่อไฟล์ที่มี [วงเล็บ] อยู่ในนั้น'
$ หา. -ชื่อ "$(printf '%q' "$element")"
./filename ที่มี [วงเล็บ] อยู่ในนั้น

  1. อย่างไรก็ตาม คุณจะมีปัญหากับช่องว่างในบรรทัด

    สำหรับ EmptyDir ใน `find ~/Desktop/ ~/Downloads/ -empty -type d`; ทำ
    

    ดู เหตุใดการวนซ้ำผลลัพธ์ของการค้นหาจึงเป็นการปฏิบัติที่ไม่ดี

  2. ยังมีอีกหลายประเด็นเช่นที่ยกมา ~ ใน [ ! -d "~/.ดาวน์โหลด" ] จะไม่ขยายไปถึง $บ้าน - โดยทั่วไปคุณควรหลีกเลี่ยง ~ ในสคริปต์

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา