Shell Script копирует и вставляет случайный файл из каталога - PullRequest
0 голосов
/ 08 февраля 2011

Заголовок в значительной степени говорит, что я ищу, чтобы добавить строку в скрипт, над которым я работаю, который скопировал бы случайный файл из директории скажем ~ / Desktop / old и вставил бы его в другую папку, скажем ~ / Desktop / новый. Я только хочу переместить один файл в новую папку каждый раз, когда запускается скрипт, я гуглил и нашел только решения для вывода случайного файла, но не мог понять, как скопировать случайный файл. Спасибо за любую помощь в решении этой проблемы

Ответы [ 5 ]

3 голосов
/ 08 февраля 2011

Вы не должны анализировать вывод 'ls': http://mywiki.wooledge.org/ParsingLs

краткая версия:

files=(src/*)
mv "${files[$RANDOM % ${#files[@]}]}" dest/

Этот код будет перемещать случайный файл, найденный в подкаталоге 'src /'в каталог dest /.

files=(src/*)                    #creates an array of all the files within src/ */
filecount="${#files[@]}"         #determines the length of the array
randomid=$((RANDOM % filecount)) #uses $RANDOM to choose a random number between 0 and $filecount
filetomove="${files[$randomid]}" #the random file wich we'll move
mv "$filetomove" dest/           #does the actual moving
1 голос
/ 08 февраля 2011

Хорошо, если вы можете повторить, просто передайте результат в cp, используя xargs. Если бы вы могли предоставить код для генерации случайного имени файла, это было бы полезно.

0 голосов
/ 17 марта 2011

Большинство из этих ответов работали при запуске из терминала на моем компьютере, однако ни один из них не работал на терминале для Android, поэтому я написал в java спасибо всем, кто помог

0 голосов
/ 08 февраля 2011

Рубин (1,9 +)

require 'fileutils'
files=[]
Dir["*"].each { |file| test(?f,file) && files << file }
FileUtils.cp(files[ rand(files.size) ] , File.join("/tmp")  )
0 голосов
/ 08 февраля 2011

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

#!/bin/bash

# Set up test data.

rm -rf tmpdata ; mkdir tmpdata
touch tmpdata/fileA tmpdata/fileB tmpdata/fileC tmpdata/fileD tmpdata/fileE

# From and To directories

fromdir=./tmpdata
todir=./tmpdata2

# Get a list of the files to a temporary file.

ls -1 ${fromdir} >/tmp/filelist.$$

# Select a number from 1 to n where n is the line count of that file.
# Then use head and tail to get the line.

filenum=$(expr $RANDOM % $(cat /tmp/filelist.$$ | wc -l) + 1)
file=$(head -${filenum} /tmp/filelist.$$ | tail -1)

# DEBUG stuff.

cat /tmp/filelist.$$ | sed 's/^/DEBUG file: /'
echo "DEBUG nmbr: ${filenum}"

echo "'cp ${fromdir}/${file} ${todir}'"

# Remove temporary file.

rm -f /tmp/filelist.$$

И некоторые примеры вывода:

pax$ ./cprnd.sh
DEBUG file: fileA
DEBUG file: fileB
DEBUG file: fileC
DEBUG file: fileD
DEBUG file: fileE
DEBUG nmbr: 3
'cp ./tmpdata/fileC ./tmpdata2'

pax$ ./cprnd.sh
DEBUG file: fileA
DEBUG file: fileB
DEBUG file: fileC
DEBUG file: fileD
DEBUG file: fileE
DEBUG nmbr: 1
'cp ./tmpdata/fileA ./tmpdata2'

pax$ ./cprnd.sh
DEBUG file: fileA
DEBUG file: fileB
DEBUG file: fileC
DEBUG file: fileD
DEBUG file: fileE
DEBUG nmbr: 5
'cp ./tmpdata/fileE ./tmpdata2'

"Магия" заключается в этих двух строках:

filenum=$(expr $RANDOM % $(cat /tmp/filelist.$$ | wc -l) + 1)
file=$(head -${filenum} /tmp/filelist.$$ | tail -1)

Первый использует wc, чтобы получить количество строк (количество файлов). Затем он дает вам остаток при делении случайного числа на это значение, так что вы получите 0..n-1 и, добавив 1, вы получите 1..n. Предположим, это дает 10 для файла из пятидесяти строк.

Следующая строка использует head, чтобы получить первые десять строк, а затем передает это через tail, чтобы получить последнюю строку этого набора (то есть, десятую строку из файла).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...