การย้ายไฟล์ที่มีนามสกุลจากต้นทางไปยังปลายทาง


0

สวัสดีฉันพยายามที่จะย้ายไฟล์ทั้งหมดด้วย.hiและ.oนามสกุลจากโฟลเดอร์เป้าหมาย/srcไปยังโฟลเดอร์อื่น/Obj

จนถึงตอนนี้ฉันได้ลอง:

    srcpath=$(pwd)"/src"

    ghc src/Main.hs > Logs/output.txt 2> Logs/Err.txt //this builds the project and generates the binaries and .hi files

    mv  *.hi *.o  $srcpath/src/ Obj/     //i want to move all these files to Obj/ folder but where do i place the extension arguments? 

คำสั่งควรเป็นอย่างไร: mv extensions source dest ?หรือmv source dest extensions

ฉันเหนื่อย:

srcpath=$(pwd)"/src"
objpath=$(pwd)"/Obj"

ghc src/Company.hs > Logs/output.txt 2> Logs/Err.txt

mv *.o *.hi  $srcpath  $objpath

และฉันได้รับข้อผิดพลาดต่อไปนี้:

    mv: cannot stat '*.o': No such file or directory
mv: cannot stat '*.hi': No such file or directory
mv: cannot move '/c/Users/[..]/src' to '/c/Users/[...]/Obj/src': Device or resource busy

คำตอบ:


2

ด้วยคำสั่งของmv *.o *.hi $srcpath $objpathคุณคุณจะย้ายไฟล์ทุกไฟล์ด้วย * .o หรือ * .hi รวมทั้งโฟลเดอร์ src จาก$(pwd)โฟลเดอร์ปัจจุบันไปยัง Obj

หากคุณต้องการย้ายทุก * .o และ * .hi ซึ่งอยู่ในโฟลเดอร์srcคุณสามารถใช้สิ่งนี้:

#!/bin/bash
srcpath=$(pwd)"/src"
objpath=$(pwd)"/Obj"

mv $srcpath/*.o $srcpath/*.hi  $objpath

ตรวจสอบให้แน่ใจว่าสคริปต์ bash ของคุณทำงานในโฟลเดอร์ที่ถูกต้องเพื่อให้$(pwd)คำสั่งทำงานได้อย่างถูกต้อง

แก้ไข:

หากคุณต้องการย้ายคอลเลกชันของไฟล์หรือไฟล์ที่มีนามสกุลที่แน่นอนคุณสามารถเปลี่ยนสคริปต์ให้เป็นเช่นนั้นได้ (ขอบคุณhttps://stackoverflow.com/a/8880633/7311363 ):

#!/bin/bash

srcpath=$(pwd)"/src"
objpath=$(pwd)"/Obj"

##declare an array variable
declare -a arr=("*.o" "*.hi")

##loop trough the array to move
for i in "${arr[@]}"
do
    mv $srcpath/$i $objpath
done

ดังนั้นจึงไม่มีวิธีในการออกชุดรวมของส่วนขยายสำหรับโฟลเดอร์ต้นทางที่กำหนดหรือไม่คุณต้องเพิ่มด้วยตนเอง extension0 $srcpath.....extensionN $srcpathมีวิธีการทำอย่างไร[extension0...extensionN] $srcpath
Bercovici Adrian

1
ฉันแก้ไขคำตอบของฉันดังนั้นคุณสามารถย้ายชื่อไฟล์ได้
chloesoe

ขอบคุณมาก แต่คุณจะกรุณาอธิบาย1.@ยืนสำหรับดัชนี? 2.เมื่อคุณเขียน$srcpath/$iและiเป็น1 ตัวอย่างมันจะเลือกไฟล์ทั้งหมดที่มี*.hiนามสกุล?
Bercovici Adrian

1.ใช่ @ คือดัชนี 2.ใช่คุณสามารถเปลี่ยนสคริปต์เพื่อทดสอบและเรียกใช้mv $srcpath/${arr[1]} $objpathจากนั้นเฉพาะไฟล์ * .hi เท่านั้นที่จะถูกย้าย
chloesoe

2

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

mv: cannot stat '*.o': No such file or directory

เป็นต้น

ไวยากรณ์เหล่านี้อาจใช้งานได้:

mv ./src/*.o ./src/*.hi ./obj/

ก็ยังจะ (ค่อนข้าง) ./srcล้มเหลวถ้าไม่มีไฟล์ที่ตรงกันใน คุณสามารถแนะนำตัวแปรตามที่คุณทำ แต่

  • คุณอาจไม่จำเป็นต้อง$(pwd), srcpath="./src"ควรจะเพียงพอ;
  • โดยทั่วไปคุณควรอ้างอิงตัวแปรของคุณ (แต่ไม่ใช่รูปแบบ) เช่น:

    mv "$srcpath"/*.o "$srcpath"/*.hi "$objpath"

argument list too longหากมีไฟล์จำนวนมากเกินไปคุณจะตี


โซลูชันทางเลือกที่ใช้findควรทำงานกับไฟล์จำนวนมากหรือไม่มีไฟล์เลย:

find "$srcpath" -name "*.o" -o -name "*.hi" -exec mv {} "$objpath" \;

ดูman 1 findเพื่อเรียนรู้วิธีการ-execทำงาน นอกจากนี้โปรดทราบว่าต้องขอบคุณคำพูดสตริงเช่น"*.o"นี้จะไม่ถูกขยายโดยเชลล์ที่นี่ findรับพวกเขาอย่างแท้จริงและใช้ขั้นตอนการจับคู่รูปแบบที่แท้จริง

การแก้ปัญหาจะทำงานแยกต่างหากmvสำหรับทุกไฟล์ เราสามารถส่งผ่านอาร์กิวเมนต์จำนวนมากเพื่อmvขอบคุณfind … -exec … {} +ไวยากรณ์ แต่เนื่องจากไวยากรณ์ต้องการอาร์กิวเมนต์เหล่านี้ในตอนท้ายเราจึงต้องmvสนับสนุน-t(ไม่จำเป็นต้องใช้โดย POSIX ดังนั้นคุณmvอาจสนับสนุนหรือไม่สนับสนุน):

find "$srcpath" -name "*.o" -o -name "*.hi" -exec mv -t "$objpath" {} +
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.