Предположим, что у меня есть папка, содержащая некоторые файлы, и некоторые папки (файлы могут иметь любой тип). И я хочу перемещаться/копировать часть того использования файлов и папок mv
/cp
команда. Есть ли какой-либо путь, такой, что я мог выбрать некоторых из них случайным образом, так же, как мы делаем выбор с помощью клавиши Ctrl и действительно перемещаемся/копируем терминал использования? Я не могу использовать ни подстановочный знак, ни регулярное выражение, поскольку я хочу выбрать файлы различных типов, и их имена имеют небольшое количество общих черт.
Если Вы хотите переместить или скопировать все файлы к тому же каталогу, можно использовать -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[@]}"
быть предупрежденным, что нет никакой проверки ошибок в этом сценарии о том, существует ли целевой каталог, или что Вы ввели корректные аргументы.
Возможно, попытайтесь использовать что-то как Полуночный Командующий ? Это - консольное приложение, которое предоставляет подобные функции графическому Файловому менеджеру Наутилуса.
Недавно я узнал эффективное решение для этой проблемы с помощью xargs.
`xargs cp
file1
file2
.....
.....
<path of the destination folder>`
Затем тип Ctrl + C
. Это будет работать наверняка. Я протестировал его. Этим методом мы можем выбрать файлы точно так же, как использование Ctrl
кнопка в графическом режиме и действительно копируем/перемещаем/удаляем.
Вот сценарий, который выбирает случайный набор файлов/каталогов, которые будут скопированы. Это может иметь дело с произвольными именами файлов, даже те, которые содержат новые строки и пробелы. Сохраните сценарий как ~/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
Обратите внимание, что это перезапишет существующие файлы, если кто-либо с тем же именем файла будет существовать в целевом каталоге.