คัดลอก / ย้ายหลายไฟล์โดยใช้ cp / mv โดยไม่ใช้นิพจน์ทั่วไป


9

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


3
คุณอาจต้องการให้ข้อมูลเพิ่มเติม ไฟล์ความคล้ายคลึงกันชนิดใดมี?
Sergiy Kolodyazhnyy

2
แม้ว่าคุณจะไม่สามารถใช้นิพจน์หรือสัญลักษณ์ปกติคุณอาจใช้ประโยชน์จากความคล้ายคลึงและวงเล็บปีกกาเพื่อขยายการโต้แย้ง ในทุบตีนะถ้าคุณมี file1, file2, file3 ในขณะที่หนึ่งในคำตอบดังต่อไปนี้คุณก็สามารถใช้หรือสำหรับช่วงcp -t /dest/ file{1,2,3} cp -t /dest/ file{1..3}การทำงานสำหรับ args ไม่ใช่ตัวเลขและการรวมกันเกินไปเช่นรันcp -t /dest/ f{ile,ly}.{csv,txt} cp -t /dest/ file.txt file.csv fly.txt fly.csvระวังสิ่งที่เขียนทับหากตำแหน่งสำคัญ แต่ฉันคิดว่ามันมีประโยชน์
neocpp

ทำไมคุณต้องการสิ่งนี้ ทำไมไม่ใช้ตัวจัดการไฟล์ตามที่คุณอธิบาย เครื่องมือเชลล์พยายามที่จะคลุมเครือน้อยที่สุดเท่าที่จะทำได้
Braiam

เราทุกคนรู้ว่าเราสามารถเลือกไฟล์และโฟลเดอร์แบบสุ่มภายใต้โฟลเดอร์โดยใช้ปุ่ม Ctrl ฉันแค่อยากรู้ว่าเราสามารถใช้เทคนิคที่คล้ายกันในขณะที่ใช้งานเทอร์มินัล Linux หรือไม่
MikhilMC

คำตอบ:


11

หากคุณต้องการย้ายหรือคัดลอกไฟล์ทั้งหมดไปยังไดเรกทอรีเดียวกันคุณสามารถใช้-tตัวเลือกของcpหรือmvแต่จะหมายความว่าคุณต้องพิมพ์ / ใส่ชื่อไฟล์แต่ละไฟล์เป็นอาร์กิวเมนต์ มันทำงานในลักษณะดังต่อไปนี้มีไฟล์มากที่สุดเท่าที่เป็นข้อโต้แย้งตามที่คุณต้องการ:

cp -t /destination/directory/ file1 file2 file3

หรือ

mv -t /destination/directory/ file1 file2 file3

นี่คือลำบากมาก แต่พิมพ์ชื่อไฟล์ที่สามารถทำง่ายขึ้นโดยใช้เสร็จแท็บทุบตีของ

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

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

#!/bin/bash
directory=$1
destination=$2
selected_files=()
for f in ${directory}/*
do
  if [[ -f $f ]]
  then
    while true
    do
      read -p "Would you like to copy ${f}? y/n: " choice
      case $choice in
        y|Y) selected_files+=("$f");
             break ;;
        n|N) echo "${f} will not be copied.";
             break ;;
        *) echo "Invalid choice, enter y/n: " ;;
      esac
    done
  fi
done
echo "The following files will be copied to ${destination}."
for file in "${selected_files[@]}"
do
  echo "$file"
done
while true
do
  read -p "Are these the correct files? y/n: " confirm
  case $confirm in
    y|Y) break ;;
    n|N) echo "Exiting filechooser"; exit 1 ;;
    *) echo "Invalid choice, enter y/n: " ;;
  esac
done
cp -t "$destination" "${selected_files[@]}"

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


4

นี่คือสคริปต์ที่เลือกชุดของไฟล์ / ไดเรกทอรีที่จะคัดลอก มันสามารถจัดการกับชื่อไฟล์โดยพลการแม้กระทั่งที่มีการขึ้นบรรทัดใหม่และช่องว่าง บันทึกสคริปต์เป็น~/bin/randomCopy.shทำให้ใช้งานได้ ( chmod a+x ~/bin/randomCopy.sh) จากนั้นเรียกใช้ทำให้ไดเรกทอรีนั้นเป็นอาร์กิวเมนต์แรกไดเรกทอรีเป้าหมายเป็นไฟล์ที่สองและจำนวนไฟล์ / dirs (สคริปต์ไม่แยกความแตกต่างระหว่างไฟล์และไดเรกทอรี ตามที่คุณร้องขอ) เพื่อคัดลอก ตัวอย่างเช่นหากต้องการคัดลอก 5 ไฟล์หรือไดเรกทอรีแบบสุ่มจาก/fooไปยัง/bar:

randomCopy.sh /foo /bar 5

สคริปต์:

#!/bin/bash

if [ $# -lt 3 ]; then
        cat<<EOF 
This script needs at least 3 arguments: the source directory, the
target directory and the number of files/dirs to be copied. For example:

    $0 /from /to 5

EOF
        exit
fi 

sourceDir="$1"
targetDir="$2"
number="$3"

## Collect all file and directory names. The globstar
## bash option lets ** match all files and directories
## recursively
shopt -s globstar
dirsAndFiles=( ** )

## Get $num random numbers from 0 until
## the number of files and dirs found. This
## will let us take a random selection.
limit=$((${#dirsAndFiles[@]}-1))  
numbers=$(shuf -i 0-"$limit" -n "$number")

for num in $numbers; do
    cp -rv "${dirsAndFiles[$num]}" "$targetDir"
done

โปรดทราบว่าสิ่งนี้จะเขียนทับไฟล์ที่มีอยู่หากมีชื่อไฟล์เดียวกันอยู่ในไดเรกทอรีเป้าหมาย


0

อาจลองใช้บางอย่างเช่นMidnight Commander ? มันเป็นแอปพลิเคชั่นคอนโซลที่ให้คุณสมบัติคล้ายกับ Nautilus File Manager แบบกราฟิก


0

เมื่อเร็ว ๆ นี้ฉันพบวิธีแก้ปัญหาที่มีประสิทธิภาพสำหรับปัญหานี้โดยใช้ xargs

`xargs cp
 file1
 file2
 .....
 .....
 <path of the destination folder>`

Ctrl + Cประเภทแล้ว มันจะทำงานได้อย่างแน่นอน ฉันได้ทำการทดสอบแล้ว ด้วยวิธีนี้เราสามารถเลือกไฟล์เช่นเดียวกับการใช้Ctrlปุ่มในโหมดกราฟิกและทำการคัดลอก / ย้าย / ลบ

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