копіювати / переміщувати кілька файлів за допомогою cp / mv без використання регулярних виразів


9

Припустимо, у мене є папка, яка містить деякі файли та деякі папки (файли можуть бути будь-якого типу). І я хочу перемістити / скопіювати деякі з цих файлів і папок за допомогою mv/ cpcommand. Чи є такий спосіб, щоб я міг вибрати деякі з них випадковим чином, так само як ми робимо вибір за допомогою клавіші Ctrl, і робимо переміщення / копіювання за допомогою терміналу? Я не можу використовувати ні підстановку, ні звичайний вираз, оскільки хочу вибрати файли різного типу, а їхні назви мають невелику кількість подібності.


3
Ви можете надати додаткову інформацію. Які файли подібності мають?
Сергій Колодяжний

2
Навіть якщо ви не можете використовувати регулярні вирази або символи символів, ви можете скористатися подібністю і дужками для розширення аргументів. У bash все одно, якщо у вас є файл1, file2, file3, як в одній з відповідей нижче, ви можете просто використовувати cp -t /dest/ file{1,2,3}або для діапазонів cp -t /dest/ file{1..3}. Він також працює для нечислових аргументів і комбінацій, наприклад, для cp -t /dest/ f{ile,ly}.{csv,txt}виконання cp -t /dest/ file.txt file.csv fly.txt fly.csv. Будьте обережні, переписуючи речі, якщо важлива позиція, але я вважаю їх корисними.
neocpp

Навіщо вам це потрібно? Чому б не використовувати диспетчер файлів, як ви описуєте? Інструменти для оболонки намагаються бути якнайменш неоднозначними.
Брайам

Ми всі знаємо, що можемо вибрати випадкові файли та папки в папці за допомогою клавіші Ctrl. Мені просто хочеться знати, чи можемо ми реалізувати подібну методику під час використання терміналу Linux
MikhilMC

Відповіді:


11

Якщо ви хочете перемістити або скопіювати всі файли в один і той же каталог, ви можете скористатися -tопцією cpабо mv, але це означає, що вам потрібно ввести / надати кожне ім'я файлу як аргумент. Він працює таким чином, з якомога більше файлів і аргументів:

cp -t /destination/directory/ file1 file2 file3

або

mv -t /destination/directory/ file1 file2 file3

Це досить трудомістко, але введення назв файлів може бути спрощено за допомогою заповнення вкладки Баша .

Альтернативно, наступний скрипт bash знайде всі файли в каталозі, подані в якості першого аргументу, і скопіює вибрані файли в каталог призначення, поданий як другий аргумент.

Він перевіряє кожен файл і запитує, чи хочете ви скопіювати цей файл. В кінці вибору файлу він відображає список вибраних файлів і запитує, чи потрібно скопіювати їх у каталог призначення:

#!/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кнопки в графічному режимі, і робити копіювання / переміщення / видалення.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.