Shell脚本从目录中复制并粘贴随机文件

时间:2011-02-08 01:35:04

标签: bash shell random copy-paste

标题几乎说它我正在寻找为我正在处理的脚本添加一行,它将从目录中复制一个随机文件说〜/ Desktop / old并将其粘贴到另一个文件夹中说〜/ Desktop /新。我只想在每次运行脚本时将一个文件移动到新文件夹我用Google搜索并找到解决方案以回显随机文件但无法弄清楚如何复制随机文件感谢您对此问题的任何帮助< / p>

5 个答案:

答案 0 :(得分:3)

您不应该解析'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 :(得分:1)

好吧,如果你可以回应它,只需使用xargs将结果传递给cp。 如果您可以提供生成随机文件名的代码,那将会有所帮助。

答案 2 :(得分:0)

此演示脚本显示了如何从目录中选择随机文件,这应该是一个良好的开端。

#!/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管道以获取该集合的最后一行(即文件中的第十行)。

答案 3 :(得分:0)

Ruby(1.9 +)

require 'fileutils'
files=[]
Dir["*"].each { |file| test(?f,file) && files << file }
FileUtils.cp(files[ rand(files.size) ] , File.join("/tmp")  )

答案 4 :(得分:-1)

大多数这些答案在从我的计算机上的终端运行时起作用,但是它们都没有在android的终端上工作所以我最终用java编写它感谢所有有帮助的人

相关问题