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

问题描述:

标题非常多说它我正在寻找添加一行到脚本我正在努力,将从目录复制一个随机文件说〜/桌面/旧并粘贴到另一个文件夹说〜/桌面/新。我只想移动一个文件到新的文件夹每次脚本运行时,我搜索了一遍,只发现解决方案来回显一个随机文件,但无法弄清楚如何复制随机一个谢谢你对这个问题的任何帮助Shell脚本从目录中复制并粘贴一个随机文件

+0

你想移动文件,或复制它?他们从根本上是不同的操作。 – 2011-02-08 09:53:13

大多数答案来自终端我的计算机上运行时的工作但是他们没有对终端工作的Android,所以我结束了在Java语言编写它谢谢到所有的帮助

那么如果你可以回声它只是使用xargs将结果传递给cp。 如果你可以提供代码来生成随机文件名,这将是有帮助的。

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

#!/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获得前10行,然后通过tail获取该集的最后一行(即文件的第10行)的管道。

+0

使用sed -n'Np'或sed -n'N {p;}来获得指定的行号,而不是使用头部和尾部。 q;}' – 2011-02-08 09:50:12

你不应该分析“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

不,你不应该做的是把愚蠢的字符放在你的文件名中:-) – paxdiablo 2011-02-08 02:53:02

红宝石(1.9+)

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