salin / pindahkan beberapa file menggunakan cp / mv tanpa menggunakan ekspresi reguler

9

Misalkan saya memiliki folder yang berisi beberapa file dan beberapa folder (file dapat dari jenis apa pun). Dan saya ingin memindahkan / menyalin beberapa file dan folder menggunakan mv/ cpperintah. Apakah ada cara, sehingga saya bisa memilih beberapa dari mereka secara acak, sama seperti kita melakukan seleksi menggunakan tombol Ctrl, dan apakah memindahkan / menyalin menggunakan terminal? Saya tidak dapat menggunakan wildcard, maupun ekspresi reguler, karena saya ingin memilih file dari jenis yang berbeda, dan nama mereka memiliki sejumlah kecil kesamaan.

MikhilMC
sumber
3
Anda mungkin ingin memberikan info lebih lanjut. Apa jenis file kesamaan miliki?
Sergiy Kolodyazhnyy
2
Bahkan jika Anda tidak dapat menggunakan ekspresi reguler atau wildcard, Anda mungkin dapat memanfaatkan kesamaan dan kawat gigi untuk memperluas argumen. Dalam bash anyways jika Anda memiliki file1, file2, file3 seperti dalam salah satu jawaban di bawah ini, Anda bisa menggunakan cp -t /dest/ file{1,2,3}atau untuk rentang cp -t /dest/ file{1..3}. Ia bekerja untuk argumen dan kombinasi non-numerik, misalnya cp -t /dest/ f{ile,ly}.{csv,txt}dijalankan cp -t /dest/ file.txt file.csv fly.txt fly.csv. Berhati-hatilah dengan menimpa hal-hal jika posisi itu penting, tetapi menurut saya itu berguna.
neocpp
Mengapa Anda membutuhkan ini? Mengapa tidak menggunakan pengelola file seperti yang Anda gambarkan? Alat shell mencoba menjadi kurang ambigu mungkin.
Braiam
Kita semua tahu bahwa kita dapat memilih file dan folder acak di bawah folder menggunakan tombol Ctrl. Saya hanya ingin tahu apakah kita bisa menerapkan teknik serupa saat menggunakan terminal Linux
MikhilMC

Jawaban:

11

Jika Anda ingin memindahkan atau menyalin semua file ke direktori yang sama, Anda dapat menggunakan -topsi cpatau mv, tetapi ini berarti Anda harus mengetik / memasok setiap nama file sebagai argumen. Ini bekerja dengan cara berikut, dengan banyak file sebagai argumen yang Anda suka:

cp -t /destination/directory/ file1 file2 file3

atau

mv -t /destination/directory/ file1 file2 file3

Ini cukup melelahkan, tetapi mengetikkan nama file dapat dibuat lebih mudah menggunakan tab Bash .

Sebagai alternatif, skrip bash berikut akan menemukan semua file dalam direktori, diberikan sebagai argumen pertama, dan menyalin file yang dipilih ke direktori tujuan, diberikan sebagai argumen kedua.

Ia memeriksa setiap file dan menanyakan apakah Anda ingin menyalin file itu. Di akhir pemilihan file, ia memperlihatkan daftar file yang dipilih dan menanyakan apakah Anda ingin menyalinnya ke direktori tujuan:

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

Berhati-hatilah karena tidak ada kesalahan saat memeriksa skrip ini tentang apakah direktori tujuan ada, atau Anda telah memasukkan argumen yang benar.

Arronikal
sumber
4

Berikut ini skrip yang memilih sekumpulan file / direktori acak untuk disalin. Itu dapat menangani nama file yang sewenang-wenang, bahkan yang berisi baris baru dan spasi. Simpan skrip sebagai ~/bin/randomCopy.sh, buat itu dapat dieksekusi ( chmod a+x ~/bin/randomCopy.sh) dan kemudian jalankan, berikan direktori sumber sebagai argumen pertama, direktori target sebagai yang kedua dan jumlah file / direktori (skrip tidak membedakan antara file dan direktori, seperti yang Anda minta) untuk disalin. Misalnya, untuk menyalin 5 file acak atau direktori dari /fooke /bar:

randomCopy.sh /foo /bar 5

Naskah:

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

Perhatikan bahwa ini akan menimpa file yang ada jika ada dengan nama file yang sama ada di direktori target.

terdon
sumber
0

Mungkin coba gunakan sesuatu seperti Midnight Commander ? Ini adalah aplikasi konsol yang menyediakan fitur serupa dengan File Manager Nautilus grafis.

Tom
sumber
0

Baru-baru ini saya menemukan solusi yang efektif untuk masalah ini menggunakan xargs.

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

Kemudian ketik Ctrl + C. Ini pasti akan berhasil. Saya sudah mengujinya. Dengan metode ini kita dapat memilih file seperti menggunakan Ctrltombol dalam mode grafik, dan melakukan salin / pindah / hapus.

MikhilMC
sumber