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

9

Предположим, у меня есть папка, содержащая некоторые файлы и несколько папок (файлы могут быть любого типа). И я хочу переместить / скопировать некоторые из этих файлов и папок с помощью команды mv/ cp. Есть ли способ, чтобы я мог выбрать некоторые из них случайным образом, так же, как мы делаем выбор с помощью клавиши Ctrl и делаем перемещение / копирование с помощью терминала? Я не могу использовать ни подстановочные знаки, ни регулярные выражения, так как хочу выбирать файлы разных типов, и их имена имеют небольшое количество сходств.

MikhilMC
источник
3
Вы можете предоставить больше информации. Какого рода файлы сходства имеют?
Сергей Колодяжный
2
Даже если вы не можете использовать регулярные выражения или символы подстановки, вы можете использовать преимущества сходства и скобок для расширения аргументов. В любом случае, в bash, если у вас есть file1, 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 .

В качестве альтернативы следующий скрипт 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[@]}"

Имейте в виду, что в этом скрипте нет проверки ошибок на предмет того, существует ли каталог назначения или что вы ввели правильные аргументы.

Arronical
источник
4

Вот скрипт, который выбирает случайный набор файлов / каталогов для копирования. Он может иметь дело с произвольными именами файлов, даже теми, которые содержат символы новой строки и пробелы. Сохраните сценарий как ~/bin/randomCopy.sh, сделайте его исполняемым ( chmod a+x ~/bin/randomCopy.sh) и затем запустите его, указав исходный каталог в качестве первого аргумента, целевой каталог в качестве второго и число файлов / каталогов (сценарий не различает файлы и каталоги, как вы просили) для копирования. Например, чтобы скопировать 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

Обратите внимание, что это перезапишет существующие файлы, если в целевом каталоге есть файлы с таким же именем.

terdon
источник
0

Может быть, попробовать использовать что-то вроде Midnight Commander ? Это консольное приложение, которое предоставляет функции, аналогичные графическому диспетчеру файлов Nautilus.

Том
источник
0

Недавно я нашел эффективное решение этой проблемы с помощью xargs.

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

Затем введите Ctrl + C. Это будет работать наверняка. Я проверял это. С помощью этого метода мы можем выбрать файлы так же, как с помощью Ctrlкнопки в графическом режиме, и сделать копирование / перемещение / удаление.

MikhilMC
источник