sao chép / di chuyển nhiều tệp bằng cp / mv mà không sử dụng biểu thức thông thường


9

Giả sử tôi có một thư mục chứa một số tệp và một số thư mục (các tệp có thể thuộc bất kỳ loại nào). Và tôi muốn di chuyển / sao chép một số tệp và thư mục đó bằng mv/ cplệnh. Có cách nào để tôi có thể chọn ngẫu nhiên một số trong số chúng, giống như chúng ta chọn bằng phím Ctrl và di chuyển / sao chép bằng thiết bị đầu cuối không? Tôi không thể sử dụng cả ký tự đại diện, cũng không phải biểu thức chính quy, vì tôi muốn chọn các tệp thuộc các loại khác nhau và tên của chúng có số lượng tương tự nhỏ.


3
Bạn có thể muốn cung cấp thêm thông tin. Những loại tập tin tương tự có?
Sergiy Kolodyazhnyy

2
Ngay cả khi bạn không thể sử dụng biểu thức thông thường hoặc ký tự đại diện, bạn có thể tận dụng sự giống nhau và dấu ngoặc nhọn để mở rộng đối số. Trong bash anyways nếu bạn có file1, file2, file3 như một trong những câu trả lời dưới đây, bạn chỉ có thể sử dụng cp -t /dest/ file{1,2,3}hoặc cho các phạm vi cp -t /dest/ file{1..3}. Nó cũng hoạt động cho các đối số và kết hợp không phải là số, ví dụ như cp -t /dest/ f{ile,ly}.{csv,txt}thực thi cp -t /dest/ file.txt file.csv fly.txt fly.csv. Hãy cẩn thận với những thứ ghi đè nếu vị trí quan trọng, nhưng tôi thấy chúng hữu ích.
neocpp

Tại sao bạn cần điều này? Tại sao không sử dụng trình quản lý tập tin như bạn mô tả? Các công cụ shell cố gắng càng ít mơ hồ càng tốt.
Braiam

Chúng ta đều biết rằng chúng ta có thể chọn các tệp và thư mục ngẫu nhiên trong một thư mục bằng phím Ctrl. Tôi chỉ muốn biết liệu chúng ta có thể thực hiện một kỹ thuật tương tự trong khi sử dụng thiết bị đầu cuối Linux hay không
MikhilMC

Câu trả lời:


11

Nếu bạn muốn di chuyển hoặc sao chép tất cả các tệp vào cùng một thư mục, bạn có thể sử dụng -ttùy chọn cphoặc mv, nhưng điều này có nghĩa là bạn phải nhập / cung cấp mỗi tên tệp làm đối số. Nó hoạt động theo cách sau, với nhiều tệp như đối số bạn muốn:

cp -t /destination/directory/ file1 file2 file3

hoặc là

mv -t /destination/directory/ file1 file2 file3

Điều này khá tốn công, nhưng việc gõ tên tệp có thể được thực hiện dễ dàng hơn bằng cách sử dụng hoàn thành tab của Bash .

Ngoài ra, tập lệnh bash sau sẽ tìm thấy tất cả các tệp trong một thư mục, được đưa ra làm đối số đầu tiên và sao chép các tệp đã chọn vào thư mục đích, được đưa ra làm đối số thứ hai.

Nó kiểm tra từng tệp và hỏi bạn có muốn sao chép tệp đó không. Khi kết thúc chọn tệp, nó hiển thị danh sách các tệp đã chọn và hỏi bạn có muốn sao chép chúng vào thư mục đích không:

#!/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[@]}"

Được cảnh báo rằng không có lỗi kiểm tra trong tập lệnh này về việc thư mục đích có tồn tại hay bạn đã nhập đúng đối số.


4

Đây là tập lệnh chọn một tập hợp các tệp / thư mục ngẫu nhiên sẽ được sao chép. Nó có thể xử lý các tên tệp tùy ý, ngay cả những tên chứa dòng mới và dấu cách. Lưu tập lệnh dưới dạng ~/bin/randomCopy.sh, làm cho nó có thể thực thi được ( chmod a+x ~/bin/randomCopy.sh) và sau đó chạy nó, đưa nó vào thư mục nguồn làm đối số đầu tiên, thư mục đích là thứ hai và số lượng tệp / thư mục (tập lệnh không phân biệt giữa các tệp và thư mục, như bạn yêu cầu) sẽ được sao chép. Ví dụ, để sao chép 5 tập tin ngẫu nhiên hoặc thư mục từ /foođể /bar:

randomCopy.sh /foo /bar 5

Kịch bản:

#!/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

Lưu ý rằng điều này sẽ ghi đè lên các tệp hiện có nếu bất kỳ có cùng tên tệp tồn tại trong thư mục đích.


0

Có thể thử sử dụng một cái gì đó như Midnight Commander ? Đây là một ứng dụng giao diện điều khiển cung cấp các tính năng tương tự như Trình quản lý tệp Nautilus.


0

Gần đây tôi đã tìm ra một giải pháp hiệu quả cho vấn đề này bằng cách sử dụng xargs.

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

Sau đó gõ Ctrl + C. Điều này sẽ làm việc chắc chắn. Tôi đã thử nó. Theo phương pháp này, chúng ta có thể chọn các tệp giống như sử dụng Ctrlnút trong chế độ đồ họa và thực hiện sao chép / di chuyển / xóa.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.