ย้ายกลุ่มไฟล์พร้อมท์ให้ผู้ใช้ยืนยันสำหรับทุกไฟล์


9

ระบบ: Ubuntu MATE 18.04

ฉันมีคอลเลกชันของไฟล์ (ในหลายไดเรกทอรีในโครงสร้างไดเรกทอรี) และฉันต้องการย้ายหลาย ๆ ไฟล์ไปยังไดเรกทอรีอื่น ฉันสามารถบอกได้ว่าไฟล์ใดที่ฉันต้องการย้ายโดยใช้ชื่อของพวกเขา (เป็นชื่อสูตร) ​​แต่ไม่มีวิธีอื่นที่จะแยกแยะระหว่างไฟล์ที่ฉันต้องการย้ายและไฟล์ที่ฉันไม่ต้องการย้าย ฉันต้องตัดสินใจทุกไฟล์โดยการตรวจสอบชื่อตัวเอง

ดังนั้นฉันใช้คำสั่งหนึ่งครั้งสำหรับแต่ละไฟล์ที่ฉันต้องการย้ายเช่น

mv Snacks/OkaraCrackers NeedsTesting/
mv Snacks/SunflowerBrittle NeedsTesting/
mv Treats/ChocolateChilliFudge NeedsTesting/
mv Treats/PecanBlondies NeedsTesting/

แม้ว่าการเติมแท็บจะเสร็จสิ้น แต่สิ่งนี้คือการพิมพ์ที่มากเกินไป สิ่งที่ฉันอยากทำคืออะไร

shopt -s globstar
mv --prompt-me-for-every-file ** NeedsTesting/

ดังนั้นฉันสามารถกดyหรือnสำหรับแต่ละไฟล์

ฉันจะย้ายกลุ่มของไฟล์และขอให้ยืนยันสำหรับทุกไฟล์ได้อย่างไร

คำตอบ:


6

วิธีที่ 1:ในเบราว์เซอร์ไฟล์กราฟิกของคุณโดยใช้มุมมองแบบต้นไม้

ผมถือว่าเป้าหมายที่แท้จริงของคุณคือการให้ทางเลือกสำหรับแต่ละไฟล์และไม่พูดอย่างเคร่งครัดที่จะได้รับแจ้ง อย่างไรก็ตามหากคุณต้องการได้รับการแจ้งเตือนเกี่ยวกับแต่ละไฟล์ในเทอร์มินัลดูวิธีที่ 2 ด้านล่าง

เบราว์เซอร์ไฟล์กราฟิกส่วนใหญ่รองรับมุมมองแบบต้นไม้ซึ่งคุณสามารถดูลำดับชั้นของไดเรกทอรีได้หลายระดับ คุณสามารถคัดลอกหรือย้ายไฟล์ออกจากมุมมองนี้ไม่ว่าจะแยกทีละส่วนหรือโดยการเลือกไฟล์จากนั้นใช้งานในส่วนที่เลือกทั้งหมด สามารถใช้งานได้กับไฟล์จากหลาย ๆ โฟลเดอร์

ในเบราว์เซอร์ไฟล์บางไฟล์ต้องไปที่เมนูการตั้งค่าเพื่อเปิดใช้มุมมองแบบต้นไม้ ใน Caja เบราว์เซอร์ไฟล์ MATE จะเปิดใช้งานเสมอในมุมมองรายการ คลิกมุมมอง→รายการ (หรือกดCtrl+ 2) เพื่อสลับไปยังมุมมองรายการ แต่ละไดเรกทอรีมีรูปสามเหลี่ยมหันหน้าไปทางขวาเล็ก ๆ ทางด้านซ้ายของมันแสดงว่าสามารถขยายได้ หากต้องการขยายโฟลเดอร์ให้คลิกสามเหลี่ยมนั้นหรือกดปุ่ม(ลูกศรขวา) เมื่อเลือกโฟลเดอร์ ในตัวอย่างนี้ฉันได้เลือกพวกเขาทั้งหมดหนึ่งโดยหนึ่งและฉันลากพวกเขาทั้งหมดในครั้งเดียวปลายทาง:

ไฟล์หลายไฟล์ที่เลือกในโครงสร้างแบบต้นไม้ในเบราว์เซอร์ไฟล์ Caja ถูกลากไปยังโฟลเดอร์อื่น แต่ยังไม่ย้าย

สมมติว่าแหล่งที่มาและปลายทางอยู่ในไดรฟ์เดียวกันการย้ายโดยค่าเริ่มต้น หากคุณต้องการคัดลอกแทนคุณจะต้องกดCtrlปุ่มค้างไว้

สถานการณ์หลังจากการลากแล้วเสร็จซึ่งไฟล์ที่เลือกตอนนี้ทั้งหมดเข้าด้วยกันในโฟลเดอร์ปลายทางแทนที่จะเป็นตำแหน่งแยกต่างหาก

ในทางทฤษฎีแล้วมันเป็นเรื่องง่ายที่จะแก้ไขข้อผิดพลาดเมื่อใช้วิธีนี้เนื่องจากเบราว์เซอร์ไฟล์ส่วนใหญ่ (รวมถึง Caja) สนับสนุนCtrl+ Zเพื่อยกเลิกการกระทำล่าสุดรวมถึงการกระทำแบบแบตช์ อย่างไรก็ตามฉันมีโชคผสมกับที่ บางครั้งไฟล์กลับเข้าไปในโฟลเดอร์ที่ไม่ถูกต้อง

ข่าวดีก็คือคุณดูเหมือนจะทำงานกับเอกสารข้อความส่วนใหญ่ซึ่งมีแนวโน้มที่จะมีขนาดเล็กดังนั้นคุณจึงสามารถสำรองข้อมูลเพิ่มเติมtarเป็นครั้งแรกโดยไม่ต้องยุ่งยากมาก ฉันขอแนะนำให้ทำเช่นนั้นโดยไม่คำนึงถึงวิธีการที่คุณใช้

วิธีที่ 2 : findคำสั่งพร้อมการ-okดำเนินการ

มันเป็นเรื่องธรรมดาที่ใช้findในการค้นหาไฟล์และส่งต่อพา ธ ของพวกเขาไปยังคำสั่งภายนอกด้วยการกระทำ-execและ -execdirแต่findยังมี-okและ-okdirแจ้งที่ก่อนแต่ละครั้งที่พวกเขาเรียกใช้คำสั่ง หากคุณต้องการได้รับแจ้งในเทอร์มินัลเกี่ยวกับแต่ละไฟล์ฉันคิดว่านี่เป็นวิธีที่จะไป

เมื่อเสร็จแล้วเพื่อสร้างเอฟเฟกต์แบบเดียวกันดังที่แสดงไว้ด้านบนนั่นจะเป็นดังนี้:

ek@Gnar:~$ find Texts -xtype f -ok mv -t 'Glorious Destination Folder' {} \;
< mv ... Texts/Robert Frost/New Hampshire.pdf > ? y
< mv ... Texts/Robert Frost/In The Clearing.pdf > ? n
< mv ... Texts/Helen Keller/The Story of My Life.pdf > ? y
< mv ... Texts/Saki/The Short Stories of Saki.pdf > ? y
< mv ... Texts/Jane Austen/Sense and Sensibility.pdf > ? n
< mv ... Texts/Jane Austen/Pride and Prejudice.pdf > ? y
< mv ... Texts/Richard Connell/The Stolen Crime.pdf > ? n
< mv ... Texts/Richard Connell/The Most Dangerous Game.txt > ? y
< mv ... Texts/Mary Wollstonecraft Shelley/Mathilda.epub > ? n
< mv ... Texts/Mary Wollstonecraft Shelley/Frankenstein: Or, The Modern Prometheus.pdf > ? y
< mv ... Texts/W. E. B. Du Bois/The Souls of Black Folk.pdf > ? n
< mv ... Texts/W. E. B. Du Bois/Darkwater: Voices from within the Veil.htm > ? y

แทนที่Textsด้วยไดเรกทอรีต้นทาง (ซึ่งอาจเป็นเพียง.ถ้าคุณต้องการcd) และGlorious Destination Folderด้วยไดเรกทอรีปลายทางจริง

คำสั่งนี้รันหนึ่งคำสั่งต่อไฟล์ แตกต่าง-execและ-execdir, -okและ-okdirไม่สนับสนุน+ในสถานที่\;ที่จะผ่านเส้นทางที่พบในหลายภาวนาเดียวกันของคำสั่ง ดังนั้นคุณไม่จำเป็นที่จะใช้รูปแบบของ-t dest mvผมขอแนะนำให้ทำเช่นนั้นอยู่แล้วแม้ว่าทั้งสองทั่วไปด้วยfindและโดยเฉพาะอย่างยิ่งในสถานการณ์เช่นนี้เพื่อให้คำแนะนำที่ปรากฏมีลักษณะเหมือนคำสั่งที่พวกเขากำลังกระตุ้นเกี่ยวกับ

ตามคำสั่งนั้นถูกเขียนหากfindพบการเชื่อมโยงสัญลักษณ์ที่ชี้ไปยังไฟล์ปกติในที่สุดคำสั่งนั้น (ลิงก์ไม่ใช่เป้าหมาย) จะถูกย้ายมากกว่าที่จะละเว้น ถ้าคุณอยากที่จะดำเนินการเพียงหนึ่งไฟล์ปกติใช้แทน-type f-xtype f

คุณอาจต้องการทำสิ่งนี้ในscriptเซสชันเพื่อให้คุณสามารถคิดได้ว่าเกิดอะไรขึ้นถ้าคุณทำผิดพลาด แต่อีกครั้งไม่มีเหตุผลที่จะไม่มีการสำรองข้อมูล

วิธีที่ 3:สร้างรายการและแก้ไข

อย่างน้อยตราบใดที่ไฟล์ไม่มีบรรทัดใหม่ในชื่อคุณสามารถเริ่มต้นได้โดยใช้findคำสั่งง่าย ๆในการสร้างไฟล์ Manifest --a ที่แสดงชื่อไฟล์ที่คุณสนใจ (ในกรณีนี้) :

find Texts -xtype f >manifest

แทนที่manifestด้วยชื่ออะไรก็ตามที่คุณต้องการสำหรับไฟล์ที่แสดงรายการไฟล์ที่จะต้องพิจารณา (และปรับเปลี่ยนทิศทางที่เหลือตามนั้น)

ดังกล่าวข้างต้นแทนที่Textsด้วยไดเรกทอรีแหล่งที่แท้จริงของคุณซึ่งอาจเป็น.หากคุณได้cdไป อย่างไรก็ตามหากTextsเป็นเส้นทางสัมพัทธ์ (รวมถึงถ้าเป็น.) คุณควรตรวจสอบให้แน่ใจว่าอยู่ในตำแหน่งเดียวกันในภายหลังเมื่อคุณทำการเคลื่อนไหวจริง ๆ

หลังจากเรียกใช้findคำสั่งนั้นให้เปิดmanifestในโปรแกรมแก้ไขข้อความ ซึ่งอาจเป็นnano, vim, emacs, gedit, plumaฯลฯ ในการแก้ไข, ความคิดเห็นออกบรรทัดที่ชื่อไฟล์ที่คุณไม่ต้องการที่จะย้ายโดยการวาง#ที่จุดเริ่มต้นของพวกเขา บรรณาธิการบางคนจะเน้นบรรทัดเหล่านั้นให้แตกต่างกันแม้ว่าจะไม่รู้จักไฟล์ของคุณว่าอยู่ในรูปแบบใดก็ตามที่ทราบว่ามีความคิดเห็น แม้ว่าส่วนใหญ่จะไม่และเหตุผลที่แท้จริงที่ฉันแนะนำให้ทำเช่นนี้คือคุณในฐานะมนุษย์มีแนวโน้มที่จะมีประสบการณ์ในการแสดงความคิดเห็นบรรทัดในไฟล์กำหนดค่า (และอาจอยู่ในซอร์สโค้ด) ผมคิดว่านี่คือใช้งานง่ายมากขึ้นและข้อผิดพลาดน้อยกว่ามันจะทำเครื่องหมายบรรทัดที่คุณไม่ต้องการที่จะย้าย

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

ในตัวอย่างของฉันนี่คือสิ่งที่เนื้อหาของไฟล์ดูเหมือนหลังจากที่ฉันแก้ไขมัน:

Texts/Robert Frost/New Hampshire.pdf
# Texts/Robert Frost/In The Clearing.pdf
Texts/Helen Keller/The Story of My Life.pdf
Texts/Saki/The Short Stories of Saki.pdf
# Texts/Jane Austen/Sense and Sensibility.pdf
Texts/Jane Austen/Pride and Prejudice.pdf
# Texts/Richard Connell/The Stolen Crime.pdf
Texts/Richard Connell/The Most Dangerous Game.txt
# Texts/Mary Wollstonecraft Shelley/Mathilda.epub
Texts/Mary Wollstonecraft Shelley/Frankenstein: Or, The Modern Prometheus.pdf
# Texts/W. E. B. Du Bois/The Souls of Black Folk.pdf
Texts/W. E. B. Du Bois/Darkwater: Voices from within the Veil.htm

จากนั้นคุณสามารถกรองบรรทัดที่คอมเม้นต์ด้วยgrepและไพพ์ผลลัพธ์xargsเพื่อส่งผ่านไปยังmv:

grep -Pv '^\s*#' manifest | xargs -d '\n' mv -t 'Glorious Destination Folder'

ข้างต้นแทนที่Glorious Destination Folderด้วยชื่อของปลายทางที่แท้จริง แค่นั้นแหละ; ไฟล์ของคุณถูกย้าย แน่นอนคุณสามารถเขียนechoก่อนmvเพื่อดูคำสั่งที่จะทำงานก่อนหากคุณต้องการ

วิธีการทำงานของคำสั่งคือ:

  1. grepบรรทัดคำสั่งเอาท์พุทจากmanifestที่ไม่ ( -v) เริ่มต้น ( ^) ที่มีตัวเลือก ( *) ช่องว่าง ( \s) ตามด้วยตัวอักษร#ตัวอักษร การ-Pตั้งค่าสถานะเลือก PCRE เป็นภาษาถิ่นของนิพจน์ทั่วไป (ซึ่งทำให้\sฉันพิจารณาว่าสามารถอ่านได้มากกว่าแบบดั้งเดิม[[:space:]])
  2. xargsคำสั่งแบ่งปัจจัยการผลิต (ซึ่งก็คือการส่งออกของgrep) ในช่อง newline สิ้นสุด ( -d '\n') จากนั้นวางแต่ละฟิลด์ (โดยไม่ต้องขึ้นบรรทัดใหม่ยุติ) เป็นอาร์กิวเมนต์แยกต่างหากในตอนท้ายของคำสั่งmv -t 'Glorious Destination Folder'ซึ่งมันจะทำงาน

1
-okIMHO คำตอบที่ดีที่สุด
PIM

7

นี่เป็นสคริปต์ขนาดเล็ก ( mv-confirm.sh):

#!/bin/bash

# Just make sure there are at least one source and one destination
if [ "$#" -lt 2 ]; then
    echo "Illegal number of parameters"
fi

DESTINATION=${*:$#}             # last argument
SOURCES=( ${@:1:$#-1} )         # all but last arguments

for i in "${SOURCES[@]}"
do
    read -p "move '$i' to '$DESTINATION' ? [y/n] " -n 1 -r
    echo
    if [[ $REPLY =~ ^[Yy]$ ]]
    then
        echo mv "$i" "$DESTINATION"
    fi
done

ตัวอย่างการใช้งาน:

./mv-confirm.sh ** somewhere
move 'a' to 'somewhere' ? [y/n] n
move 'b' to 'somewhere' ? [y/n] y
mv b d
...

อย่าลืมทำให้สคริปต์ทำงานได้ ( chmod +x mv-confirm.sh).

NB

เนื่องจากฉันไม่ต้องการยุ่งกับไฟล์ของคุณฉันจึงเพิ่มechoก่อนmv คำสั่งจริง อย่าลังเลที่จะลบมันสำหรับการย้ายไฟล์จริง

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