ฉันกำลังพยายามที่จะคัดลอกเฉพาะชุดย่อยของไฟล์จากไดเรกทอรีหนึ่งไปยังอีกโดยใช้แต่กำลังได้รับการต้อนรับด้วยข้อความcp
cp: cannot stat [^\.php]': No such file or directory
มีวิธีใช้นิพจน์ทั่วไปโดยใช้cp
คำสั่งเท่านั้นหรือไม่
ฉันกำลังพยายามที่จะคัดลอกเฉพาะชุดย่อยของไฟล์จากไดเรกทอรีหนึ่งไปยังอีกโดยใช้แต่กำลังได้รับการต้อนรับด้วยข้อความcp
cp: cannot stat [^\.php]': No such file or directory
มีวิธีใช้นิพจน์ทั่วไปโดยใช้cp
คำสั่งเท่านั้นหรือไม่
คำตอบ:
เลขที่
cp
คำสั่งไม่ได้มีความสามารถในการดำเนินการใด ๆ ของการขัดแย้งในฐานะการแสดงออกปกติ แม้กระทั่งไวด์การ์ดจะไม่ถูกจัดการ (หรือไฟล์ที่รันได้ส่วนใหญ่); ค่อนข้างจะถูกจัดการโดยเชลล์
cp test/* test2/
ถูกขยายโดยการทุบตีจริง ๆ และสิ่งที่cp
เห็นจริงๆสำหรับข้อโต้แย้งของมันคือcp test/file1 test/file2 test/file3 test2/
(หรืออะไรก็ตามที่เหมาะสมตามเนื้อหาจริงของtest/
)
นอกจากนี้ฉันไม่คิดว่านิพจน์ของคุณ[^\.php]
จะตรงกับสิ่งที่คุณต้องการ (ไม่ตรงกับไฟล์ที่มี.php
)
คุณอาจต้องการค้นหาfind
ยูทิลิตีเพื่อกรองรายการไฟล์ตามนิพจน์ทั่วไปจากนั้นใช้xargs
เพื่อใช้รายการไฟล์ที่ส่งคืนไปยังcp
คำสั่ง (การสันนิษฐานว่า find ไม่มีตัวจัดการในตัวสำหรับการคัดลอกไฟล์; ฉันไม่คุ้นเคยกับเครื่องมือ)
คุณอาจลอง:
find . ! -iregex ".*\.php.*" -exec cp {} /destination/folder/ \;
นี้กล่าวในการค้นหาไดเรกทอรีปัจจุบันซ้ำสำหรับไฟล์ที่ไม่ได้มี ".php" /destination/folder/
ในเส้นทางและคัดลอกลงใน
ตามที่ร้องขอการแยกย่อยของอาร์กิวเมนต์ที่ระบุเพิ่มเติม:
.
- ตำแหน่งเพื่อเริ่มการค้นหา - ในกรณีนี้คือไดเรกทอรีปัจจุบัน !
- โอเปอเรเตอร์ "ไม่ใช่" กลับด้านผลลัพธ์ของการทดสอบถัดไป -iregex
- การทดสอบการแสดงออกปกติกรณีที่ไม่สำคัญ อาร์กิวเมนต์ต่อไปคือการแสดงออก ".*\.php.*"
- การจับคู่นิพจน์ทั่วไป<Anything>.php<Anything>
- ไฟล์ใด ๆ ที่มี ".php" อยู่ที่ใดที่หนึ่งในพา ธ (หมายเหตุรวมถึงอยู่ในโฟลเดอร์ที่มี ".php" อยู่ในชื่อคุณจะต้องมีนิพจน์ที่ซับซ้อนมากขึ้นเพื่อให้ตรงกับไฟล์เท่านั้น)-exec
- ดำเนินการคำสั่งหากการทดสอบก่อนหน้านี้กลับมาจริง อาร์กิวเมนต์ถัดไปคือคำสั่งอาร์กิวเมนต์ที่เหลือทั้งหมดจะ;
ถูกส่งไปยังคำสั่ง {}
คืออาร์กิวเมนต์ที่พิเศษที่เป็นตัวแทนของชื่อไฟล์cp
- คำสั่งที่ find` ควรรันบนชื่อพา ธ ที่ตรงกันแต่ละชื่อ{}
- เส้นทางไปยังไฟล์ที่พบส่งผ่านไปยังcp
อาร์กิวเมนต์เพื่อให้รู้ว่าไฟล์ใดที่จะคัดลอก/destination/folder/
- ส่งผ่านอาร์กิวเมนต์ไปยังcp
บอกcp
ตำแหน่งที่ควรคัดลอกไฟล์ไป\;
- นี่คือเทอร์;
มินอลที่-exec
กำลังค้นหา เราหลบหนีไปพร้อมกับ\
เพื่อให้เปลือกของคุณไม่พยายามแยกมันและดึงมันเป็นอาร์กิวเมนต์ของคำสั่ง ( find
)มันค่อนข้างยากที่จะเขียนนิพจน์ปกติซึ่งตรงกับ "สายที่ไม่ได้.php
" ดังนั้นเราจึงแทนที่จะบอกfind
เพื่อค้นหาสตริงที่ไม่ประกอบด้วยแล้วกลับผลกับ.php
!
cp
และไบนารีอื่น ๆ ไม่สามารถขยายการแสดงผลปกติได้ คุณคิดอย่างละเอียดว่าตัวเลือกและอาร์กิวเมนต์แต่ละตัวมีความหมายอย่างไรในตัวอย่างตัวอย่างที่คุณให้ ฉันรู้ว่า.
หมายถึงไดเรกทอรีปัจจุบัน แต่สิ่งที่!
, {}
, \;
ฯลฯ อ้างถึงเช่นเดียวกับสิ่งที่พวกเขาหมายถึงอะไร? ยกตัวอย่างเช่นทำไมคุณต้องหลบหนี;
?
find . -name '[^\.txt]' -exec rm {} \;
find
อาจเป็นความผิดพลาดในส่วนของฉัน แต่ไม่แน่ใจในสิ่งที่ฉันทำผิด เท่าที่ความเข้าใจของฉัน{}
อ้างถึงแต่ละไฟล์ที่พบโดยคำสั่งfind . -name '[^\.txt]'
คุณสามารถใช้เครื่องมืออื่น ๆ จากคอนโซลเช่น grep และ xargs
ls -1 some_folder | egrep 'some_extended_regex' | xargs cp -t destination_folder
{}
ที่แตกต่างกันกับที่-t
?
คุณสามารถเรียกใช้คำสั่งต่อไปนี้ใช้งานง่าย:
find /home/usr/search_dir -iname *file_name_portion*.txt | xargs cp -t /home/usr/destination_folder
Haa เย็น !!
find . -name [^\.php] -exec cp {} /path/to/location \;
ระวังไฟล์ที่มีตัวอักษรพิเศษ