将x个文件移动到其他目录中

时间:2017-02-28 23:53:20

标签: bash shell

我发现这个bash脚本效果很好

for file in $(ls -p | grep -v / | tail -241)
do
mv $file ../01
done

我的bash foo很弱,基本上如果我在目录中运行会将最后241个文件移动到/ 01

的文件夹中

问题是脚本本身必须在包含所有文件的目录中,并且我当前的mount没有执行权限。我想要做的是从文件夹外的某个地方执行此脚本,例如我的工作目录/ home / user /

我当前的根目录位于不同的驱动器/分区上,而不是我要编写脚本的所有文件。

for file in **/media/storage1/allfiles** $(ls -p | grep -v / | tail -241)
do
mv $file ../01  <this should remain local to /media/storage/
done

**编辑** 我通过在循环之前添加它来实现此功能 cd the/directory/I/want/to/be/in

例如

cd /media/storage1/allfiles  
for file in $(ls -p | grep -v / | tail -241)
do
    mv $file ../01
done

更好的问题是:这是正确的方法,还是有正确的方法?

1 个答案:

答案 0 :(得分:2)

bash中,我会执行以下操作以避免使用ls。它利用了这样一个事实,即你并没有尝试以任何特定的方式对文件进行排序,因此路径名扩展提供的任何顺序都足够了。

cd /media/storage1/allfiles
# Get *all* regular files in the target directory
for f in *; do
    [[ -f $f ]] && files+=("$f")
done
# Get the file count
n=${#files[@]}
# How many files are we *not* moving
# Assume n > 241
keep=$((n - 241 ))
# Move the last 241 files
mv -- "${files[@]:keep}" ../01

据推测,241个文件不会溢出命令行。

未经请求的zsh插件......

zsh使这更容易,因为你可以让shell对glob本身做很多选择。

mv /media/storage/allfiles/*(.On[1,241]) ../01

glob之后的(...)是一组限定文件列表生成的glob限定符。 .表示只应匹配常规文件。 On按名称以相反顺序对列表进行排序(可以使用适当的字符替换n来使用其他排序顺序)。 [1,241]将列表限制为前241个文件;因为我们按相反的顺序排序,这会给你最后241个文件。