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


9

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


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

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


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

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


0

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


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.