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

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

8
задан 20 July 2016 в 02:34

4 ответа

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

cp -t /destination/directory/ file1 file2 file3

или

mv -t /destination/directory/ file1 file2 file3

Это является довольно трудоемким, но ввод имен файлов может быть сделан более легким использованием заполнение клавишей Tab 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[@]}"

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

10
ответ дан 23 November 2019 в 05:30

Возможно, попытайтесь использовать что-то как Полуночный Командующий ? Это - консольное приложение, которое предоставляет подобные функции графическому Файловому менеджеру Наутилуса.

0
ответ дан 23 November 2019 в 05:30

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

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

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

0
ответ дан 23 November 2019 в 05:30

Вот сценарий, который выбирает случайный набор файлов/каталогов, которые будут скопированы. Это может иметь дело с произвольными именами файлов, даже те, которые содержат новые строки и пробелы. Сохраните сценарий как ~/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

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

4
ответ дан 23 November 2019 в 05:30

Другие вопросы по тегам:

Похожие вопросы: