我发现这个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
更好的问题是:这是正确的方法,还是有正确的方法?
答案 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个文件。